|
I've found something that is quite unusual happening to my VC source files. Occasionally, when I compile, I get errors due to one character having been changed in one of my source files, or the src or include files in my Visual Studio directories. Usually the character is simply changed from lower to upper case, it seems at random.
For instance, today I had this change in my xlocale file, which prevented me compiling:
***** goodXLOCALE
static const mask * __cdecl classic_table() _THROW0()
***** badXLOCALE
static coNst mask * __cdecl classic_table() _THROW0()
***** Has anyone else ever seen this? Does anyone have any clue as to what it might be?
I look forward to hearing suggestions!
Puzzled Paul.
"The way of a fool seems right to him, but a wise man listens to advice" - Proverbs 12:15 (NIV)
|
|
|
|
|
I have never seen it but it almost sounds like a virus or something similar if it is randomly changing data on the hard drive.
|
|
|
|
|
Hi
How i can to create my ones callback function????
Thank.
|
|
|
|
|
Are you wanting to know how to create a callback funtion? If so, it depends on the context. Generally, however, you'll want to use the CALLBACK data type.
Five birds are sitting on a fence.
Three of them decide to fly off.
How many are left?
|
|
|
|
|
Another solution is __stdcall.
unsigned int __stdcall Function(datatype param);
Kuphryn
|
|
|
|
|
(sorry for the repost but this is really bugging me still):
The first time i call EncryptString (below) I pass "asdf" it encrypts to to be a length of 25 and encrypts it right. But when i try to encrypt a 2539 length string it returns a string of a length of 225 and only partically encrypted. Why is this happening and how do I fix it?
CString CEncyptionClass::EncryptString(CString m_strUnencryptedString)
{
//variables
//Date:11 22 03
CString m_strResultingText;
HCRYPTPROV hProv = NULL;
HCRYPTKEY hKey = NULL;
HCRYPTHASH hHash = NULL;
DWORD dwLength;
BYTE * pbBuffer;
LPTSTR m_tContents=ConvertCStringToChar(m_strUnencryptedString);
TCHAR szLocalPassword[] = _T("alongrandompassword");
//
// Get handle to user default provider.
if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))
{
// Create hash object.
if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
{
// Hash password string.
dwLength = _tcslen(szLocalPassword);
if (CryptHashData(hHash, (BYTE *)szLocalPassword, dwLength, 0))
{
// Create block cipher session key based on hash of the password.
if (CryptDeriveKey(hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey))
{
dwLength= _tcslen(m_tContents);
pbBuffer=(BYTE*)malloc(dwLength);
if (pbBuffer != NULL)
{
memcpy(pbBuffer, m_tContents, dwLength);
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength))
{
m_strResultingText.Format("%s",pbBuffer);
CString strShow;
strShow.Format("After: %s \r\n(%s)\r\n %d %d", m_strResultingText,m_tContents,strlen((const char*) pbBuffer) ,dwLength);
MessageBox(strShow);
}
free(pbBuffer);
}
CryptDestroyKey(hKey); // Release provider handle.
}
}
CryptDestroyHash(hHash); // Destroy session key.
}
CryptReleaseContext(hProv, 0);
}
return m_strResultingText;
}
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
You sure it's not MessageBox not showing full string?... I assume you may get not printable characters after encoding.
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
The length of pbBuffer and m_strResultText is 225 .. the plain text string is 2539
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
That means according to your code:
LPTSTR m_tContents=ConvertCStringToChar(m_strUnencryptedString);
returns 225 length string...
Check ConvertCStringToChar function.
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
It's string is 2539 also, and its right.
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
Now I'm a little bit confused:
You are saying:
I pass "asdf" it encrypts to to be a length of 25 and encrypts it right.
But according to your code:
dwLength= _tcslen(m_tContents);<br />
pbBuffer=(BYTE*)malloc(dwLength);<br />
if (pbBuffer != NULL)<br />
{<br />
memcpy(pbBuffer, m_tContents, dwLength);<br />
<br />
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength))
You are only allocating 4 bytes in pbBuffer, as dwLength=4. Right?
How you get 25?
Maybe I missunderstanding...
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
The first time that m_Contents is "<password>asdf" it is encrypted to a 25 string (dwLength==25 for the orginal and after ) but then i pass a 2539 character long string to it and it encrypts only 255 (the dwLenght is also at 2539 when it goes to crypt encrypt
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
But according to your code with m_tContents="asdf":
dwLength= _tcslen(m_tContents); // <= will give you 4
pbBuffer=(BYTE*)malloc(dwLength); // <= pbBuffer should be allocated with 4 bytes
if (pbBuffer != NULL)
{
memcpy(pbBuffer, m_tContents, dwLength);
if (CryptEncrypt(hKey, 0, true, 0, pbBuffer, &dwLength, dwLength)) // <= should encrypt just 4 bytes
How you get 25, and if dwLength=25 after the call your pbBuffer is overrun!
However you passed dwLength = 4, your CryptEncrypt either should fail or your pbBuffer should be overrun
How are you getting 25?...
Could you be more specific?
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
noooo... m_tContents would equal "<password>asdf</password>" sorry about that .... ugh
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
If interested: Please provide ConvertCStringToChar() implementation....
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
LPTSTR CEncyptionClass::ConvertCStringToChar(CString string_to_be_converted)
{
LPTSTR return_value=new TCHAR[string_to_be_converted.GetLength()+1];
_tcscpy(return_value,string_to_be_converted);
return return_value;
}
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
I'm almost giving up. But check this:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/cryptencrypt.asppadding
A string, typically added when the last plaintext block is short. For example, if the block length is 64 bits and the last block contains only 40 bits, then 24 bits of padding must be added to the last block. The padding string may contain zeros, alternating zeros and ones, or some other pattern. Applications that use CryptoAPI need not add padding to their plaintext before it is encrypted, nor do they have to remove it after decrypting. This is all handled automatically
So, maybe you need to increase dwLength and make it even with 8 bytes length.
However, why CryptEncrypt is not failing then? Or maybe it does?
"...Ability to type is not enough to become a Programmer. Unless you type in VB. But then again you have to type really fast..."
Me
|
|
|
|
|
GetLastError doesn't return an error. The 2539 string is the only thing that messes up for some reason like i said it only encrypts 225 (thats whats returned from pbBuffer with dwLength set by strlen to 2539) and when passed through the decrypt function it returns the first 225 plaintext characters nothing after that
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
The length of pbBuffer and m_strResultText is 225 .. the plain text string is 2539, also it encrypts: "<password>something" fine but then when it gets called to encrypt the 2539 length string it messes up and encodes/returns only 225.
-Steven Hicks
CPACodeProjectAddict
|
|
|
|
|
Hello guys,
I`m currently writing software for a Pocket PC. The problem with that is memory-leak detection is not so straight-forward as in Visual C++ 6.0 debugger.
Can anybody help me with a way how I can detect memory leaks and where they are located.
Not just memory leaks caused by new and delete( found a way for that allready here on Codeproject ), but also by GUI components. (CreateObjectIndirect vs DeleteObject etc...).
Is there a way to see if maybe memory is leaked in third party libraries or dll`s ?
I mean, I looked my code from front to back, left to right, back to front, right to left and it looks all good to me, but still it looks like I leak memory and I don^t have a clue where that could be happening..
If anybode can provide any help, please do. Or if you know any links where a solution might be found, please let me know.
Greetz,
Davy
|
|
|
|
|
The most best way to check for memory leaks is the most apparent as well: in your dev. environment, start some type of memory monitor, like the Task Manager in Windows. Then just run & stop your test application for 10-15 times in a row. If you see a radical memory increase, then you have a leak.
Small memory leaks (under 10 kb) are usually not even detectable, and in most cases, harmless. Of course, if you don't boot the Pocket PC at all, then they may cause an issue in a long run.
In the end, if you don't have access to MSVC++'s debugger, you should invest on some Memory Validator programs available commercially. They are _made_ for detecting memory/handle/GUI leaks, and are very efficient at it.
I'm not sure what you use to create the GUI. But C/C++ does not care. Everything always comes down to using new/delete pair. The MFC framework does it, deep down under. You just can't see it. Even the RUNTIME_CLASS macro's and the related functions use new/delete, or the C-version, malloc.
For the Windows GUI and MFC, the rule of thumb for resource leaks is that if you load a resource from a disk file and don't unload it, then you leak memory. If you load the resource from your application instance (it is saved in the resource script), then you don't need to release it, as it is released automatically when the instance exits.
All in all, get a memory validation software. It'll help you a long way without headaches.
-Antti Keskinen
----------------------------------------------
The definition of impossible is strictly dependant
on what we think is possible.
|
|
|
|
|
Hi!
Need some help with converting integer to char. Because it can't find this function. Is there only atoi that is build in the library? And if so, do I have to make my own itoa?
Do someone know?
|
|
|
|
|
you could use the following
int i=56;
char sNumber[10]; //what the hell let`s make it big enough..
sprintf(sNumber, "%d", i);
so sprintf can function as your itoa.
Greetz,
Davy
|
|
|
|
|
|
Any one know a Form Designer for Visual C++.NET (UnManaged, MFC) ???
If not, who's the better choice to design a form without Resource Editor ???
"We are de power, there is no power without knowledgement"
|
|
|
|
|