Reference counting for CRYPTPROVs in advapi32.dll
Michael Jung
mjung at iss.tu-darmstadt.de
Tue Jul 13 15:09:24 CDT 2004
Ciao,
Michael
Changelog:
Reference counting for CRYPTPROV objects.
Implemented CryptContextAddRef.
Index: dlls/advapi32/crypt.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/crypt.c,v
retrieving revision 1.36
diff -u -r1.36 crypt.c
--- dlls/advapi32/crypt.c 12 Jul 2004 23:32:10 -0000 1.36
+++ dlls/advapi32/crypt.c 13 Jul 2004 19:07:10 -0000
@@ -183,6 +183,7 @@
FIXME("Failed to load dll %s\n", debugstr_a(pImage));
goto error;
}
+ provider->refcount = 1;
errorcode = NTE_PROVIDER_DLL_FAIL;
CRYPT_GetProvFunc(CPAcquireContext);
@@ -525,9 +526,18 @@
*/
BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD
dwFlags)
{
- FIXME("(0x%lx, %p, %08lx): stub!\n", hProv, pdwReserved, dwFlags);
- return FALSE;
- /* InterlockIncrement?? */
+ PCRYPTPROV pProv = (PCRYPTPROV)hProv;
+
+ TRACE("(0x%lx, %p, %08lx)\n", hProv, pdwReserved, dwFlags);
+
+ if (!pProv)
+ {
+ SetLastError(NTE_BAD_UID);
+ return FALSE;
+ }
+
+ pProv->refcount++;
+ return TRUE;
}
/******************************************************************************
@@ -546,7 +556,7 @@
BOOL WINAPI CryptReleaseContext (HCRYPTPROV hProv, DWORD dwFlags)
{
PCRYPTPROV pProv = (PCRYPTPROV)hProv;
- BOOL ret;
+ BOOL ret = TRUE;
TRACE("(0x%lx, %08ld)\n", hProv, dwFlags);
@@ -555,16 +565,20 @@
SetLastError(NTE_BAD_UID);
return FALSE;
}
- /* FIXME: Decrement the counter here first if possible */
- ret = pProv->pFuncs->pCPReleaseContext(pProv->hPrivate, dwFlags);
- FreeLibrary(pProv->hModule);
+
+ pProv->refcount--;
+ if (pProv->refcount <= 0)
+ {
+ ret = pProv->pFuncs->pCPReleaseContext(pProv->hPrivate, dwFlags);
+ FreeLibrary(pProv->hModule);
#if 0
- CRYPT_Free(pProv->pVTable->pContextInfo);
+ CRYPT_Free(pProv->pVTable->pContextInfo);
#endif
- CRYPT_Free(pProv->pVTable->pszProvName);
- CRYPT_Free(pProv->pVTable);
- CRYPT_Free(pProv->pFuncs);
- CRYPT_Free(pProv);
+ CRYPT_Free(pProv->pVTable->pszProvName);
+ CRYPT_Free(pProv->pVTable);
+ CRYPT_Free(pProv->pFuncs);
+ CRYPT_Free(pProv);
+ }
return ret;
}
Index: dlls/advapi32/crypt.h
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/crypt.h,v
retrieving revision 1.7
diff -u -r1.7 crypt.h
--- dlls/advapi32/crypt.h 5 Sep 2003 23:08:44 -0000 1.7
+++ dlls/advapi32/crypt.h 13 Jul 2004 19:07:10 -0000
@@ -58,6 +58,7 @@
typedef struct tagCRYPTPROV
{
+ UINT refcount;
HMODULE hModule;
PPROVFUNCS pFuncs;
HCRYPTPROV hPrivate; /*CSP's handle - Should not be given to
application under any circumstances!*/
More information about the wine-patches
mailing list