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