[ADVAPI32] Add SEH handling to some crypt functions

This fixes several crashes when running the advapi32 winetest from wine-10.0
This commit is contained in:
Carl J. Bialorucki
2026-01-08 16:21:53 -06:00
parent 4013a064b0
commit 9844effa41

View File

@@ -622,6 +622,10 @@ BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFl
return FALSE;
}
#ifdef __REACTOS__
_SEH2_TRY
{
#endif
if (pProv->dwMagic != MAGIC_CRYPTPROV)
{
SetLastError(ERROR_INVALID_PARAMETER);
@@ -629,6 +633,15 @@ BOOL WINAPI CryptContextAddRef (HCRYPTPROV hProv, DWORD *pdwReserved, DWORD dwFl
}
InterlockedIncrement(&pProv->refcount);
#ifdef __REACTOS__
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastError(ERROR_INVALID_PARAMETER);
_SEH2_YIELD(return FALSE);
}
_SEH2_END;
#endif
return TRUE;
}
@@ -746,12 +759,25 @@ BOOL WINAPI CryptCreateHash (HCRYPTPROV hProv, ALG_ID Algid, HCRYPTKEY hKey,
TRACE("(0x%lx, 0x%x, 0x%lx, %08x, %p)\n", hProv, Algid, hKey, dwFlags, phHash);
#ifdef __REACTOS__
_SEH2_TRY
{
#endif
if (!prov || !phHash || prov->dwMagic != MAGIC_CRYPTPROV ||
(key && key->dwMagic != MAGIC_CRYPTKEY))
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
#ifdef __REACTOS__
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastError(ERROR_INVALID_PARAMETER);
_SEH2_YIELD(return FALSE);
}
_SEH2_END;
#endif
if (dwFlags)
{
SetLastError(NTE_BAD_FLAGS);
@@ -806,6 +832,10 @@ BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen);
#ifdef __REACTOS__
_SEH2_TRY
{
#endif
if (!key || !pbData || !pdwDataLen ||
!key->pProvider || key->dwMagic != MAGIC_CRYPTKEY ||
key->pProvider->dwMagic != MAGIC_CRYPTPROV)
@@ -817,6 +847,15 @@ BOOL WINAPI CryptDecrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
prov = key->pProvider;
return prov->pFuncs->pCPDecrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
Final, dwFlags, pbData, pdwDataLen);
#ifdef __REACTOS__
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastError(ERROR_INVALID_PARAMETER);
_SEH2_YIELD(return FALSE);
}
_SEH2_END;
#endif
}
/******************************************************************************
@@ -1099,6 +1138,10 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p, %d)\n", hKey, hHash, Final, dwFlags, pbData, pdwDataLen, dwBufLen);
#ifdef __REACTOS__
_SEH2_TRY
{
#endif
if (!key || !pdwDataLen || !key->pProvider ||
key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
{
@@ -1109,6 +1152,15 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
prov = key->pProvider;
return prov->pFuncs->pCPEncrypt(prov->hPrivate, key->hPrivate, hash ? hash->hPrivate : 0,
Final, dwFlags, pbData, pdwDataLen, dwBufLen);
#ifdef __REACTOS__
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastError(ERROR_INVALID_PARAMETER);
_SEH2_YIELD(return FALSE);
}
_SEH2_END;
#endif
}
/******************************************************************************
@@ -1421,6 +1473,10 @@ BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType,
TRACE("(0x%lx, 0x%lx, %d, %08x, %p, %p)\n", hKey, hExpKey, dwBlobType, dwFlags, pbData, pdwDataLen);
#ifdef __REACTOS__
_SEH2_TRY
{
#endif
if (!key || !pdwDataLen || !key->pProvider ||
key->dwMagic != MAGIC_CRYPTKEY || key->pProvider->dwMagic != MAGIC_CRYPTPROV)
{
@@ -1431,6 +1487,15 @@ BOOL WINAPI CryptExportKey (HCRYPTKEY hKey, HCRYPTKEY hExpKey, DWORD dwBlobType,
prov = key->pProvider;
return prov->pFuncs->pCPExportKey(prov->hPrivate, key->hPrivate, expkey ? expkey->hPrivate : 0,
dwBlobType, dwFlags, pbData, pdwDataLen);
#ifdef __REACTOS__
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
SetLastError(ERROR_INVALID_PARAMETER);
_SEH2_YIELD(return FALSE);
}
_SEH2_END;
#endif
}
/******************************************************************************