Re: STATUS_STACK_BUFFER_OVERRUN encountered
"Manoj Jangid" <manoj.jangid@gmail.com> wrote in message
news:1a57ab86-d772-45bf-87ed-e3dcab39c34b@a12g2000pro.googlegroups.com...
Hi I am calling a function from MFC dll in C# application.
This function work with C++ application but when I was calling from C#
application terminates unexpectedly.
can anyone tell me why this happening?
I am pasting my source code here
---------------------------------------------------
C# code
--------------
private void button1_Click(object sender, EventArgs e)
{
string strPassWord = textBox1.Text;
string strHash = "";
PasswordHash(strPassWord,ref strHash);
MessageBox.Show(strHash);
}
-----------------
PasswordHash function in my MFC regular statically linked to MFC dll
C++ code
bool __stdcall PasswordHash(LPCTSTR lpPassword, LPTSTR lpszHash)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString strPassword(lpPassword);
bool bReturn = false;
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash=NULL;
BYTE pbHash[16];
DWORD dwHashLen= 16;
DWORD cbContent= strPassword.GetLength() * sizeof(TCHAR);
BYTE* pbContent= (BYTE *) strPassword.GetBuffer(cbContent);
if(CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL,
CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
{
if(CryptCreateHash(hCryptProv,CALG_MD5,0, 0, &hHash))
{
if(CryptHashData(hHash, pbContent, cbContent, 0))
{
if(CryptGetHashParam(hHash, HP_HASHVAL, pbHash, &dwHashLen, 0))
{
LPTSTR lpTmp = lpszHash;
for (int i = 0; i < 16; i++)
{
const size_t nlen = sizeof(pbHash[i])+2;
_stprintf_s(lpTmp,nlen,_T("%02X"),pbHash[i]);
lpTmp += 2;
}
bReturn = true;
}
}
}
}
CryptDestroyHash(hHash);
CryptReleaseContext(hCryptProv, 0);
return bReturn;
}
Thanks for the excellent problem description. Could you please provide one
more piece of info: how do you prototype PasswordHash() using P/Invoke?
e.g. since lpszHash is an output string, you need to prototype it similar
to the lpString parameter in GetWindowText as shown:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int
nMaxCount);
If you don't, you could well be overwriting memory that doesn't exist in
your loop.
-- David