[PATCH v3 5/5] ntoskrnl.exe/tests: Remove unnecessary store and certs handles.
Rémi Bernon
rbernon at codeweavers.com
Mon Sep 6 05:27:17 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 133 +++++++++++++++--------------
1 file changed, 71 insertions(+), 62 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index b7926232cfb..99487cc0116 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -85,15 +85,9 @@ static void load_resource(const WCHAR *name, WCHAR *filename)
CloseHandle( file );
}
-struct testsign_context
-{
- const CERT_CONTEXT *cert, *root_cert, *publisher_cert;
- HCERTSTORE root_store, publisher_store;
-};
-
static const WCHAR container_name[] = L"wine_testsign";
-static BOOL testsign_create_cert(struct testsign_context *ctx)
+static const CERT_CONTEXT *testsign_create_cert(void)
{
BYTE encoded_name[100], encoded_key_id[200], public_key_info_buffer[1000];
BYTE hash_buffer[16], cert_buffer[1000], provider_nameA[100], serial[16];
@@ -101,16 +95,16 @@ static BOOL testsign_create_cert(struct testsign_context *ctx)
CRYPT_KEY_PROV_INFO provider_info = {0};
CRYPT_ALGORITHM_IDENTIFIER algid = {0};
CERT_AUTHORITY_KEY_ID_INFO key_info;
+ HCERTSTORE root_store, pub_store;
CERT_INFO cert_info = {0};
WCHAR provider_nameW[100];
+ const CERT_CONTEXT *cert;
CERT_EXTENSION extension;
HCRYPTPROV provider;
HCRYPTKEY key;
DWORD size;
BOOL ret;
- memset(ctx, 0, sizeof(*ctx));
-
ret = CryptAcquireContextW(&provider, container_name, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET);
if (!ret && GetLastError() == NTE_EXISTS)
{
@@ -176,8 +170,8 @@ static BOOL testsign_create_cert(struct testsign_context *ctx)
X509_CERT_TO_BE_SIGNED, &cert_info, &algid, NULL, cert_buffer, &size);
ok(ret, "Failed to create certificate, error %#x\n", GetLastError());
- ctx->cert = CertCreateCertificateContext(X509_ASN_ENCODING, cert_buffer, size);
- ok(!!ctx->cert, "Failed to create context, error %#x\n", GetLastError());
+ cert = CertCreateCertificateContext(X509_ASN_ENCODING, cert_buffer, size);
+ ok(!!cert, "Failed to create context, error %#x\n", GetLastError());
size = sizeof(provider_nameA);
ret = CryptGetProvParam(provider, PP_NAME, provider_nameA, &size, 0);
@@ -188,70 +182,85 @@ static BOOL testsign_create_cert(struct testsign_context *ctx)
provider_info.pwszProvName = provider_nameW;
provider_info.dwProvType = PROV_RSA_FULL;
provider_info.dwKeySpec = AT_SIGNATURE;
- ret = CertSetCertificateContextProperty(ctx->cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &provider_info);
+ ret = CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, &provider_info);
ok(ret, "Failed to set provider info, error %#x\n", GetLastError());
ret = CryptReleaseContext(provider, 0);
ok(ret, "failed to release context, error %u\n", GetLastError());
- ctx->root_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "root");
- if (!ctx->root_store && GetLastError() == ERROR_ACCESS_DENIED)
+ root_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "root");
+ if (!root_store && GetLastError() == ERROR_ACCESS_DENIED)
{
skip("Failed to open root store.\n");
-
- ret = CertFreeCertificateContext(ctx->cert);
+ ret = CertFreeCertificateContext(cert);
ok(ret, "Failed to free certificate, error %u\n", GetLastError());
-
- return FALSE;
+ return NULL;
}
- ok(!!ctx->root_store, "Failed to open store, error %u\n", GetLastError());
- ret = CertAddCertificateContextToStore(ctx->root_store, ctx->cert, CERT_STORE_ADD_ALWAYS, &ctx->root_cert);
+ ok(!!root_store, "Failed to open store, error %u\n", GetLastError());
+ ret = CertAddCertificateContextToStore(root_store, cert, CERT_STORE_ADD_ALWAYS, NULL);
if (!ret && GetLastError() == ERROR_ACCESS_DENIED)
{
skip("Failed to add self-signed certificate to store.\n");
- ret = CertFreeCertificateContext(ctx->cert);
+ ret = CertFreeCertificateContext(cert);
ok(ret, "Failed to free certificate, error %u\n", GetLastError());
- ret = CertCloseStore(ctx->root_store, CERT_CLOSE_STORE_CHECK_FLAG);
+ ret = CertCloseStore(root_store, CERT_CLOSE_STORE_CHECK_FLAG);
ok(ret, "Failed to close store, error %u\n", GetLastError());
- return FALSE;
+ return NULL;
}
ok(ret, "Failed to add certificate, error %u\n", GetLastError());
+ ret = CertCloseStore(root_store, CERT_CLOSE_STORE_CHECK_FLAG);
+ ok(ret, "Failed to close store, error %u\n", GetLastError());
- ctx->publisher_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0,
+ pub_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0,
CERT_SYSTEM_STORE_LOCAL_MACHINE, "trustedpublisher");
- ok(!!ctx->publisher_store, "Failed to open store, error %u\n", GetLastError());
- ret = CertAddCertificateContextToStore(ctx->publisher_store, ctx->cert,
- CERT_STORE_ADD_ALWAYS, &ctx->publisher_cert);
+ ok(!!pub_store, "Failed to open store, error %u\n", GetLastError());
+ ret = CertAddCertificateContextToStore(pub_store, cert, CERT_STORE_ADD_ALWAYS, NULL);
ok(ret, "Failed to add certificate, error %u\n", GetLastError());
+ ret = CertCloseStore(pub_store, CERT_CLOSE_STORE_CHECK_FLAG);
+ ok(ret, "Failed to close store, error %u\n", GetLastError());
- return TRUE;
+ return cert;
}
-static void testsign_cleanup(struct testsign_context *ctx)
+static void testsign_cleanup(const CERT_CONTEXT *cert)
{
+ HCERTSTORE root_store, pub_store;
+ const CERT_CONTEXT *store_cert;
HCRYPTPROV provider;
BOOL ret;
- ret = CertFreeCertificateContext(ctx->cert);
- ok(ret, "Failed to free certificate, error %u\n", GetLastError());
-
- ret = CertDeleteCertificateFromStore(ctx->root_cert);
+ root_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0,
+ CERT_SYSTEM_STORE_LOCAL_MACHINE, "root");
+ ok(!!root_store, "Failed to open store, error %u\n", GetLastError());
+ store_cert = CertFindCertificateInStore(root_store, X509_ASN_ENCODING, 0,
+ CERT_FIND_EXISTING, cert, NULL);
+ ok(!!store_cert, "Failed to find root certificate, error %u\n", GetLastError());
+ ret = CertDeleteCertificateFromStore(store_cert);
ok(ret, "Failed to remove certificate, error %u\n", GetLastError());
- ret = CertCloseStore(ctx->root_store, CERT_CLOSE_STORE_CHECK_FLAG);
+ ret = CertCloseStore(root_store, CERT_CLOSE_STORE_CHECK_FLAG);
ok(ret, "Failed to close store, error %u\n", GetLastError());
- ret = CertDeleteCertificateFromStore(ctx->publisher_cert);
+ pub_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0,
+ CERT_SYSTEM_STORE_LOCAL_MACHINE, "trustedpublisher");
+ ok(!!pub_store, "Failed to open store, error %u\n", GetLastError());
+ store_cert = CertFindCertificateInStore(pub_store, X509_ASN_ENCODING, 0,
+ CERT_FIND_EXISTING, cert, NULL);
+ ok(!!store_cert, "Failed to find publisher certificate, error %u\n", GetLastError());
+ ret = CertDeleteCertificateFromStore(store_cert);
ok(ret, "Failed to remove certificate, error %u\n", GetLastError());
- ret = CertCloseStore(ctx->publisher_store, CERT_CLOSE_STORE_CHECK_FLAG);
+ ret = CertCloseStore(pub_store, CERT_CLOSE_STORE_CHECK_FLAG);
ok(ret, "Failed to close store, error %u\n", GetLastError());
+ ret = CertFreeCertificateContext(cert);
+ ok(ret, "Failed to free certificate, error %u\n", GetLastError());
+
ret = CryptAcquireContextW(&provider, container_name, NULL, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
ok(ret, "Failed to delete container, error %#x\n", GetLastError());
}
-static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename)
+static void testsign_sign(const CERT_CONTEXT *cert, const WCHAR *filename)
{
SIGNER_ATTR_AUTHCODE authcode = {sizeof(authcode)};
SIGNER_SIGNATURE_INFO signature = {sizeof(signature)};
@@ -268,7 +277,7 @@ static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename)
file.pwszFileName = (WCHAR *)filename;
cert_info.dwCertChoice = 2;
cert_info.pCertStoreInfo = &store;
- store.pSigningCert = ctx->cert;
+ store.pSigningCert = cert;
store.dwCertPolicy = 0;
signature.algidHash = CALG_SHA_256;
signature.dwAttrChoice = SIGNER_AUTHCODE_ATTR;
@@ -298,7 +307,7 @@ static void unload_driver(SC_HANDLE service)
CloseServiceHandle(service);
}
-static SC_HANDLE load_driver(struct testsign_context *ctx, WCHAR *filename,
+static SC_HANDLE load_driver(const CERT_CONTEXT *cert, WCHAR *filename,
const WCHAR *resname, const WCHAR *driver_name)
{
SC_HANDLE manager, service;
@@ -316,7 +325,7 @@ static SC_HANDLE load_driver(struct testsign_context *ctx, WCHAR *filename,
if (service) unload_driver(service);
load_resource(resname, filename);
- testsign_sign(ctx, filename);
+ testsign_sign(cert, filename);
trace("Trying to load driver %s\n", debugstr_w(filename));
service = CreateServiceW(manager, driver_name, driver_name,
@@ -1136,13 +1145,13 @@ static void test_object_info(void)
CloseHandle(file);
}
-static void test_driver3(struct testsign_context *ctx)
+static void test_driver3(const CERT_CONTEXT *cert)
{
WCHAR filename[MAX_PATH];
SC_HANDLE service;
BOOL ret;
- service = load_driver(ctx, filename, L"driver3.dll", L"WineTestDriver3");
+ service = load_driver(cert, filename, L"driver3.dll", L"WineTestDriver3");
ok(service != NULL, "driver3 failed to load\n");
ret = StartServiceA(service, 0, NULL);
@@ -1216,14 +1225,14 @@ static DWORD WINAPI wsk_test_thread(void *parameter)
return TRUE;
}
-static void test_driver_netio(struct testsign_context *ctx)
+static void test_driver_netio(const CERT_CONTEXT *cert)
{
WCHAR filename[MAX_PATH];
SC_HANDLE service;
HANDLE hthread;
BOOL ret;
- if (!(service = load_driver(ctx, filename, L"driver_netio.dll", L"winetest_netio")))
+ if (!(service = load_driver(cert, filename, L"driver_netio.dll", L"winetest_netio")))
return;
if (!start_driver(service, TRUE))
@@ -1413,7 +1422,7 @@ static void pnp_driver_stop(void)
ok(ret || GetLastError() == ERROR_FILE_NOT_FOUND, "Failed to delete file, error %u\n", GetLastError());
}
-static void pnp_driver_start(struct testsign_context *ctx, const WCHAR *resource)
+static void pnp_driver_start(const CERT_CONTEXT *cert, const WCHAR *resource)
{
static const WCHAR hardware_id[] = L"test_hardware_id\0";
SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
@@ -1456,7 +1465,7 @@ static void pnp_driver_start(struct testsign_context *ctx, const WCHAR *resource
ret = CryptCATClose(catalog);
ok(ret, "Failed to close catalog, error %u\n", GetLastError());
- testsign_sign(ctx, L"winetest.cat");
+ testsign_sign(cert, L"winetest.cat");
/* Install the driver. */
@@ -1838,7 +1847,7 @@ static void test_pnp_devices(void)
UnregisterClassA("ntoskrnl_test_wc", GetModuleHandleA(NULL));
}
-static void test_pnp_driver(struct testsign_context *ctx)
+static void test_pnp_driver(const CERT_CONTEXT *cert)
{
char cwd[MAX_PATH], tempdir[MAX_PATH];
@@ -1846,7 +1855,7 @@ static void test_pnp_driver(struct testsign_context *ctx)
GetTempPathA(ARRAY_SIZE(tempdir), tempdir);
SetCurrentDirectoryA(tempdir);
- pnp_driver_start(ctx, L"driver_pnp.dll");
+ pnp_driver_start(cert, L"driver_pnp.dll");
test_pnp_devices();
pnp_driver_stop();
@@ -3323,7 +3332,7 @@ static void test_hid_device(DWORD report_id, DWORD polled)
winetest_pop_context();
}
-static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD polled)
+static void test_hid_driver(const CERT_CONTEXT *cert, DWORD report_id, DWORD polled)
{
char cwd[MAX_PATH], tempdir[MAX_PATH];
LSTATUS status;
@@ -3342,7 +3351,7 @@ static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD
status = RegSetValueExW(hkey, L"PolledMode", 0, REG_DWORD, (void *)&polled, sizeof(polled));
ok(!status, "RegSetValueExW returned %#x\n", status);
- pnp_driver_start(ctx, L"driver_hid.dll");
+ pnp_driver_start(cert, L"driver_hid.dll");
test_hid_device(report_id, polled);
pnp_driver_stop();
@@ -3352,8 +3361,8 @@ static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD
START_TEST(ntoskrnl)
{
WCHAR filename[MAX_PATH], filename2[MAX_PATH];
- struct testsign_context ctx;
SC_HANDLE service, service2;
+ const CERT_CONTEXT *cert;
BOOL ret, is_wow64;
HANDLE mapping;
DWORD written;
@@ -3372,7 +3381,7 @@ START_TEST(ntoskrnl)
return;
}
- if (!testsign_create_cert(&ctx))
+ if (!(cert = testsign_create_cert()))
return;
mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
@@ -3388,7 +3397,7 @@ START_TEST(ntoskrnl)
ok(okfile != INVALID_HANDLE_VALUE, "failed to create file, error %u\n", GetLastError());
subtest("driver");
- if (!(service = load_driver(&ctx, filename, L"driver.dll", L"WineTestDriver")))
+ if (!(service = load_driver(cert, filename, L"driver.dll", L"WineTestDriver")))
goto out;
if (!start_driver(service, FALSE))
@@ -3396,7 +3405,7 @@ START_TEST(ntoskrnl)
DeleteFileW(filename);
goto out;
}
- service2 = load_driver(&ctx, filename2, L"driver2.dll", L"WineTestDriver2");
+ service2 = load_driver(cert, filename2, L"driver2.dll", L"WineTestDriver2");
device = CreateFileA("\\\\.\\WineTestDriver", 0, 0, NULL, OPEN_EXISTING, 0, NULL);
ok(device != INVALID_HANDLE_VALUE, "failed to open device: %u\n", GetLastError());
@@ -3428,21 +3437,21 @@ START_TEST(ntoskrnl)
cat_okfile();
- test_driver3(&ctx);
+ test_driver3(cert);
subtest("driver_netio");
- test_driver_netio(&ctx);
+ test_driver_netio(cert);
subtest("driver_pnp");
- test_pnp_driver(&ctx);
+ test_pnp_driver(cert);
subtest("driver_hid");
- test_hid_driver(&ctx, 0, FALSE);
- test_hid_driver(&ctx, 1, FALSE);
- test_hid_driver(&ctx, 0, TRUE);
- test_hid_driver(&ctx, 1, TRUE);
+ test_hid_driver(cert, 0, FALSE);
+ test_hid_driver(cert, 1, FALSE);
+ test_hid_driver(cert, 0, TRUE);
+ test_hid_driver(cert, 1, TRUE);
out:
- testsign_cleanup(&ctx);
+ testsign_cleanup(cert);
UnmapViewOfFile(test_data);
CloseHandle(mapping);
CloseHandle(okfile);
--
2.33.0
More information about the wine-devel
mailing list