Thereby making it easier to use them from ntoskrnl, setupapi, and other modules.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/mssign32/mssign32_main.c | 3 +-- dlls/mssign32/mssign32_private.h => include/wine/mssign.h | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename dlls/mssign32/mssign32_private.h => include/wine/mssign.h (100%)
diff --git a/dlls/mssign32/mssign32_main.c b/dlls/mssign32/mssign32_main.c index 86825bf0ec1..c76d467f3f4 100644 --- a/dlls/mssign32/mssign32_main.c +++ b/dlls/mssign32/mssign32_main.c @@ -26,8 +26,7 @@
#include "wine/debug.h" #include "wine/heap.h" - -#include "mssign32_private.h" +#include "wine/mssign.h"
WINE_DEFAULT_DEBUG_CHANNEL(mssign);
diff --git a/dlls/mssign32/mssign32_private.h b/include/wine/mssign.h similarity index 100% rename from dlls/mssign32/mssign32_private.h rename to include/wine/mssign.h
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/tests/driver.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 9da62c44dd5..0f5ab76a195 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -1466,7 +1466,7 @@ @ stdcall -private ZwQueryInstallUILanguage(ptr) NtQueryInstallUILanguage @ stdcall -private ZwQueryKey(long long ptr long ptr) NtQueryKey @ stdcall -private ZwQueryLicenseValue(ptr ptr ptr long ptr) NtQueryLicenseValue -@ stdcall -private ZwQueryObject(long long ptr long ptr) NtQueryObject +@ stdcall ZwQueryObject(long long ptr long ptr) NtQueryObject @ stdcall -private ZwQuerySection(long long ptr long ptr) NtQuerySection @ stdcall -private ZwQuerySecurityObject(long long ptr long ptr) NtQuerySecurityObject @ stdcall -private ZwQuerySymbolicLinkObject(long ptr ptr) NtQuerySymbolicLinkObject diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index d1ec8a7e5b9..49eb6742247 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -197,10 +197,15 @@ static void WINAPI test_load_image_notify_routine(UNICODE_STRING *image_name, HA
static void test_load_driver(void) { + char full_name_buffer[300]; + OBJECT_NAME_INFORMATION *full_name = (OBJECT_NAME_INFORMATION *)full_name_buffer; static WCHAR image_path_key_name[] = L"ImagePath"; RTL_QUERY_REGISTRY_TABLE query_table[2]; UNICODE_STRING name, image_path; + OBJECT_ATTRIBUTES attr; + IO_STATUS_BLOCK io; NTSTATUS ret; + HANDLE file;
ret = PsSetLoadImageNotifyRoutine(test_load_image_notify_routine); ok(ret == STATUS_SUCCESS, "Got unexpected status %#x.\n", ret); @@ -221,6 +226,15 @@ static void test_load_driver(void) ok(ret == STATUS_SUCCESS, "Got unexpected status %#x.\n", ret); ok(!!image_path.Buffer, "image_path.Buffer is NULL.\n");
+ /* The image path name in the registry may contain NT symlinks (e.g. DOS + * drives), which are resolved before the callback is called. */ + InitializeObjectAttributes(&attr, &image_path, OBJ_KERNEL_HANDLE, NULL, NULL); + ret = ZwOpenFile(&file, SYNCHRONIZE, &attr, &io, 0, FILE_SYNCHRONOUS_IO_NONALERT); + ok(!ret, "Got unexpected status %#x.\n", ret); + ret = ZwQueryObject(file, ObjectNameInformation, full_name_buffer, sizeof(full_name_buffer), NULL); + ok(!ret, "Got unexpected status %#x.\n", ret); + ZwClose(file); + RtlInitUnicodeString(&name, driver2_path);
ret = ZwLoadDriver(&name); @@ -232,7 +246,8 @@ static void test_load_driver(void) "Got unexpected ImageAddressingMode %#x.\n", test_image_info.ImageAddressingMode); ok(test_image_info.SystemModeImage, "Got unexpected SystemModeImage %#x.\n", test_image_info.SystemModeImage); - ok(!wcscmp(test_load_image_name, image_path.Buffer), "Image path names do not match.\n"); + ok(!wcscmp(test_load_image_name, full_name->Name.Buffer), "Expected image path name %ls, got %ls.\n", + full_name->Name.Buffer, test_load_image_name);
test_load_image_notify_count = -1;
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87570
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driE511.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driE511.tmp.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driBDD3.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driBDD3.tmp. driver.c:268: Test failed: Got unexpected test_load_image_notify_count 0.
=== w8 (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\dri3554.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\dri3554.tmp.
=== debiant2 (32 bit report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\dri673e.tmp.
=== debiant2 (32 bit French report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\dri95aa.tmp.
=== debiant2 (32 bit Japanese:Japan report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name *, got C:\users\winetest\Temp\dric5f9.tmp.
=== debiant2 (32 bit Chinese:China report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name Â, got C:\users\winetest\Temp\drif912.tmp.
=== debiant2 (32 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name (, got C:\users\winetest\Temp\driaac2.tmp.
=== debiant2 (64 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\drif626.tmp.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 1cfdeff0911..6abfc448d50 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -40,21 +40,21 @@ static BOOL (WINAPI *pRtlFreeUnicodeString)(UNICODE_STRING *); static BOOL (WINAPI *pCancelIoEx)(HANDLE, OVERLAPPED *); static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR);
-static void load_resource(const char *name, char *filename) +static void load_resource(const WCHAR *name, WCHAR *filename) { - static char path[MAX_PATH]; + static WCHAR path[MAX_PATH]; DWORD written; HANDLE file; HRSRC res; void *ptr;
- GetTempPathA(sizeof(path), path); - GetTempFileNameA(path, name, 0, filename); + GetTempPathW(ARRAY_SIZE(path), path); + GetTempFileNameW(path, name, 0, filename);
- file = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); - ok(file != INVALID_HANDLE_VALUE, "file creation failed, at %s, error %d\n", filename, GetLastError()); + file = CreateFileW(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "failed to create %s, error %u\n", debugstr_w(filename), GetLastError());
- res = FindResourceA(NULL, name, "TESTDLL"); + res = FindResourceW(NULL, name, L"TESTDLL"); ok( res != 0, "couldn't find resource\n" ); ptr = LockResource( LoadResource( GetModuleHandleA(NULL), res )); WriteFile( file, ptr, SizeofResource( GetModuleHandleA(NULL), res ), &written, NULL ); @@ -81,7 +81,7 @@ static void unload_driver(SC_HANDLE service) CloseServiceHandle(service); }
-static SC_HANDLE load_driver(char *filename, const char *resname, const char *driver_name) +static SC_HANDLE load_driver(WCHAR *filename, const WCHAR *resname, const WCHAR *driver_name) { SC_HANDLE manager, service;
@@ -94,13 +94,13 @@ static SC_HANDLE load_driver(char *filename, const char *resname, const char *dr ok(!!manager, "OpenSCManager failed\n");
/* stop any old drivers running under this name */ - service = OpenServiceA(manager, driver_name, SERVICE_ALL_ACCESS); + service = OpenServiceW(manager, driver_name, SERVICE_ALL_ACCESS); if (service) unload_driver(service);
load_resource(resname, filename); - trace("Trying to load driver %s\n", filename); + trace("Trying to load driver %s\n", debugstr_w(filename));
- service = CreateServiceA(manager, driver_name, driver_name, + service = CreateServiceW(manager, driver_name, driver_name, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, filename, NULL, NULL, NULL, NULL, NULL); @@ -618,11 +618,11 @@ static void test_object_info(void)
static void test_driver3(void) { - char filename[MAX_PATH]; + WCHAR filename[MAX_PATH]; SC_HANDLE service; BOOL ret;
- service = load_driver(filename, "driver3.dll", "WineTestDriver3"); + service = load_driver(filename, L"driver3.dll", L"WineTestDriver3"); ok(service != NULL, "driver3 failed to load\n");
ret = StartServiceA(service, 0, NULL); @@ -634,7 +634,7 @@ static void test_driver3(void)
DeleteService(service); CloseServiceHandle(service); - DeleteFileA(filename); + DeleteFileW(filename); }
static DWORD WINAPI wsk_test_thread(void *parameter) @@ -698,18 +698,18 @@ static DWORD WINAPI wsk_test_thread(void *parameter)
static void test_driver4(void) { - char filename[MAX_PATH]; + WCHAR filename[MAX_PATH]; SC_HANDLE service; HANDLE hthread; DWORD written; BOOL ret;
- if (!(service = load_driver(filename, "driver4.dll", "WineTestDriver4"))) + if (!(service = load_driver(filename, L"driver4.dll", L"WineTestDriver4"))) return;
if (!start_driver(service, TRUE)) { - DeleteFileA(filename); + DeleteFileW(filename); return; }
@@ -726,13 +726,13 @@ static void test_driver4(void) CloseHandle(device);
unload_driver(service); - ret = DeleteFileA(filename); + ret = DeleteFileW(filename); ok(ret, "DeleteFile failed: %u\n", GetLastError()); }
START_TEST(ntoskrnl) { - char filename[MAX_PATH], filename2[MAX_PATH]; + WCHAR filename[MAX_PATH], filename2[MAX_PATH]; SC_HANDLE service, service2; DWORD written; BOOL ret; @@ -745,14 +745,14 @@ START_TEST(ntoskrnl) "SetFileCompletionNotificationModes");
subtest("driver"); - if (!(service = load_driver(filename, "driver.dll", "WineTestDriver"))) + if (!(service = load_driver(filename, L"driver.dll", L"WineTestDriver"))) return; if (!start_driver(service, FALSE)) { - DeleteFileA(filename); + DeleteFileW(filename); return; } - service2 = load_driver(filename2, "driver2.dll", "WineTestDriver2"); + service2 = load_driver(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()); @@ -778,9 +778,9 @@ START_TEST(ntoskrnl)
unload_driver(service2); unload_driver(service); - ret = DeleteFileA(filename); + ret = DeleteFileW(filename); ok(ret, "DeleteFile failed: %u\n", GetLastError()); - ret = DeleteFileA(filename2); + ret = DeleteFileW(filename2); ok(ret, "DeleteFile failed: %u\n", GetLastError());
test_driver3();
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87571
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driC40A.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driC40A.tmp.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driBE02.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driBE02.tmp.
=== w8 (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\dri346A.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\dri346A.tmp.
=== debiant2 (32 bit report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name 2, got C:\users\winetest\Temp\dri6d0a.tmp.
=== debiant2 (32 bit French report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name Â, got C:\users\winetest\Temp\dri9b2c.tmp.
=== debiant2 (32 bit Japanese:Japan report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name Â, got C:\users\winetest\Temp\dricfbc.tmp.
=== debiant2 (32 bit Chinese:China report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\dri194.tmp.
=== debiant2 (32 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name H, got C:\users\winetest\Temp\dria2fc.tmp.
=== debiant2 (64 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name (, got C:\users\winetest\Temp\dried8e.tmp.
Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntoskrnl.exe/tests/Makefile.in | 2 +- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 212 ++++++++++++++++++++++++++-- 2 files changed, 201 insertions(+), 13 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/Makefile.in b/dlls/ntoskrnl.exe/tests/Makefile.in index 779d4b28e6d..4b2052d43f4 100644 --- a/dlls/ntoskrnl.exe/tests/Makefile.in +++ b/dlls/ntoskrnl.exe/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = ntoskrnl.exe -IMPORTS = advapi32 ws2_32 +IMPORTS = advapi32 crypt32 wintrust ws2_32
driver_IMPORTS = winecrt0 ntoskrnl driver_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 6abfc448d50..16949526484 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -28,8 +28,13 @@ #include "winioctl.h" #include "winternl.h" #include "winsock2.h" +#include "wincrypt.h" +#include "ntsecapi.h" +#include "mscat.h" +#include "mssip.h" #include "wine/test.h" #include "wine/heap.h" +#include "wine/mssign.h"
#include "driver.h"
@@ -39,6 +44,9 @@ static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(const WCHAR *, UNICODE_STRIN static BOOL (WINAPI *pRtlFreeUnicodeString)(UNICODE_STRING *); static BOOL (WINAPI *pCancelIoEx)(HANDLE, OVERLAPPED *); static BOOL (WINAPI *pSetFileCompletionNotificationModes)(HANDLE, UCHAR); +static HRESULT (WINAPI *pSignerSign)(SIGNER_SUBJECT_INFO *subject, SIGNER_CERT *cert, + SIGNER_SIGNATURE_INFO *signature, SIGNER_PROVIDER_INFO *provider, + const WCHAR *timestamp, CRYPT_ATTRIBUTES *attr, void *sip_data);
static void load_resource(const WCHAR *name, WCHAR *filename) { @@ -62,6 +70,174 @@ static void load_resource(const WCHAR *name, WCHAR *filename) CloseHandle( file ); }
+struct testsign_context +{ + HCRYPTPROV provider; + const CERT_CONTEXT *cert, *root_cert, *publisher_cert; + HCERTSTORE root_store, publisher_store; +}; + +static void testsign_create_cert(struct testsign_context *ctx) +{ + BYTE encoded_name[100], encoded_key_id[200], public_key_info_buffer[1000]; + WCHAR container_name[26]; + BYTE hash_buffer[16], cert_buffer[1000], provider_nameA[100], serial[16]; + CERT_PUBLIC_KEY_INFO *public_key_info = (CERT_PUBLIC_KEY_INFO *)public_key_info_buffer; + CRYPT_KEY_PROV_INFO provider_info = {0}; + CRYPT_ALGORITHM_IDENTIFIER algid = {0}; + CERT_AUTHORITY_KEY_ID_INFO key_info; + CERT_INFO cert_info = {0}; + WCHAR provider_nameW[100]; + CERT_EXTENSION extension; + HCRYPTKEY key; + DWORD size; + BOOL ret; + + memset(ctx, 0, sizeof(*ctx)); + + srand(time(NULL)); + swprintf(container_name, ARRAY_SIZE(container_name), L"wine_testsign%u", rand()); + + ret = CryptAcquireContextW(&ctx->provider, container_name, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET); + ok(ret, "Failed to create container, error %#x\n", GetLastError()); + + ret = CryptGenKey(ctx->provider, AT_SIGNATURE, CRYPT_EXPORTABLE, &key); + ok(ret, "Failed to create key, error %#x\n", GetLastError()); + ret = CryptDestroyKey(key); + ok(ret, "Failed to destroy key, error %#x\n", GetLastError()); + ret = CryptGetUserKey(ctx->provider, AT_SIGNATURE, &key); + ok(ret, "Failed to get user key, error %#x\n", GetLastError()); + ret = CryptDestroyKey(key); + ok(ret, "Failed to destroy key, error %#x\n", GetLastError()); + + size = sizeof(encoded_name); + ret = CertStrToNameA(X509_ASN_ENCODING, "CN=winetest_cert", CERT_X500_NAME_STR, NULL, encoded_name, &size, NULL); + ok(ret, "Failed to convert name, error %#x\n", GetLastError()); + key_info.CertIssuer.cbData = size; + key_info.CertIssuer.pbData = encoded_name; + + size = sizeof(public_key_info_buffer); + ret = CryptExportPublicKeyInfo(ctx->provider, AT_SIGNATURE, X509_ASN_ENCODING, public_key_info, &size); + ok(ret, "Failed to export public key, error %#x\n", GetLastError()); + cert_info.SubjectPublicKeyInfo = *public_key_info; + + size = sizeof(hash_buffer); + ret = CryptHashPublicKeyInfo(ctx->provider, CALG_MD5, 0, X509_ASN_ENCODING, public_key_info, hash_buffer, &size); + ok(ret, "Failed to hash public key, error %#x\n", GetLastError()); + + key_info.KeyId.cbData = size; + key_info.KeyId.pbData = hash_buffer; + + RtlGenRandom(serial, sizeof(serial)); + key_info.CertSerialNumber.cbData = sizeof(serial); + key_info.CertSerialNumber.pbData = serial; + + size = sizeof(encoded_key_id); + ret = CryptEncodeObject(X509_ASN_ENCODING, X509_AUTHORITY_KEY_ID, &key_info, encoded_key_id, &size); + ok(ret, "Failed to convert name, error %#x\n", GetLastError()); + + extension.pszObjId = (char *)szOID_AUTHORITY_KEY_IDENTIFIER; + extension.fCritical = TRUE; + extension.Value.cbData = size; + extension.Value.pbData = encoded_key_id; + + cert_info.dwVersion = CERT_V3; + cert_info.SerialNumber = key_info.CertSerialNumber; + cert_info.SignatureAlgorithm.pszObjId = (char *)szOID_RSA_SHA1RSA; + cert_info.Issuer = key_info.CertIssuer; + GetSystemTimeAsFileTime(&cert_info.NotBefore); + GetSystemTimeAsFileTime(&cert_info.NotAfter); + cert_info.NotAfter.dwHighDateTime += 1; + cert_info.Subject = key_info.CertIssuer; + cert_info.cExtension = 1; + cert_info.rgExtension = &extension; + algid.pszObjId = (char *)szOID_RSA_SHA1RSA; + size = sizeof(cert_buffer); + ret = CryptSignAndEncodeCertificate(ctx->provider, AT_SIGNATURE, X509_ASN_ENCODING, + 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()); + + size = sizeof(provider_nameA); + ret = CryptGetProvParam(ctx->provider, PP_NAME, provider_nameA, &size, 0); + ok(ret, "Failed to get prov param, error %#x\n", GetLastError()); + MultiByteToWideChar(CP_ACP, 0, (char *)provider_nameA, -1, provider_nameW, ARRAY_SIZE(provider_nameW)); + + provider_info.pwszContainerName = (WCHAR *)container_name; + 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); + ok(ret, "Failed to set provider info, error %#x\n", GetLastError()); + + ctx->root_store = CertOpenStore(CERT_STORE_PROV_SYSTEM_REGISTRY_A, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, "root"); + 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(ret, "Failed to add certificate, error %u\n", GetLastError()); + + ctx->publisher_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(ret, "Failed to add certificate, error %u\n", GetLastError()); +} + +static void testsign_cleanup(struct testsign_context *ctx) +{ + BOOL ret; + + ret = CertFreeCertificateContext(ctx->cert); + ok(ret, "Failed to free certificate, error %u\n", GetLastError()); + + ret = CertDeleteCertificateFromStore(ctx->root_cert); + ok(ret, "Failed to remove certificate, error %u\n", GetLastError()); + ret = CertFreeCertificateContext(ctx->root_cert); + ok(ret, "Failed to free certificate, error %u\n", GetLastError()); + ret = CertCloseStore(ctx->root_store, CERT_CLOSE_STORE_CHECK_FLAG); + ok(ret, "Failed to close store, error %u\n", GetLastError()); + + ret = CertDeleteCertificateFromStore(ctx->publisher_cert); + ok(ret, "Failed to remove certificate, error %u\n", GetLastError()); + ret = CertFreeCertificateContext(ctx->publisher_cert); + ok(ret, "Failed to free certificate, error %u\n", GetLastError()); + ret = CertCloseStore(ctx->publisher_store, CERT_CLOSE_STORE_CHECK_FLAG); + ok(ret, "Failed to close store, error %u\n", GetLastError()); + + ret = CryptReleaseContext(ctx->provider, 0); + ok(ret, "failed to release context, error %u\n", GetLastError()); +} + +static void testsign_sign(struct testsign_context *ctx, const WCHAR *filename) +{ + SIGNER_ATTR_AUTHCODE authcode = {sizeof(authcode)}; + SIGNER_SIGNATURE_INFO signature = {sizeof(signature)}; + SIGNER_SUBJECT_INFO subject = {sizeof(subject)}; + SIGNER_CERT_STORE_INFO store = {sizeof(store)}; + SIGNER_CERT cert_info = {sizeof(cert_info)}; + SIGNER_FILE_INFO file = {sizeof(file)}; + DWORD index = 0; + HRESULT hr; + + subject.dwSubjectChoice = 1; + subject.pdwIndex = &index; + subject.pSignerFileInfo = &file; + file.pwszFileName = (WCHAR *)filename; + cert_info.dwCertChoice = 2; + cert_info.pCertStoreInfo = &store; + store.pSigningCert = ctx->cert; + store.dwCertPolicy = 0; + signature.algidHash = CALG_SHA_256; + signature.dwAttrChoice = SIGNER_AUTHCODE_ATTR; + signature.pAttrAuthcode = &authcode; + authcode.pwszName = L""; + authcode.pwszInfo = L""; + hr = pSignerSign(&subject, &cert_info, &signature, NULL, NULL, NULL, NULL); + todo_wine ok(hr == S_OK, "Failed to sign, hr %#x\n", hr); +} + static void unload_driver(SC_HANDLE service) { SERVICE_STATUS status; @@ -81,7 +257,8 @@ static void unload_driver(SC_HANDLE service) CloseServiceHandle(service); }
-static SC_HANDLE load_driver(WCHAR *filename, const WCHAR *resname, const WCHAR *driver_name) +static SC_HANDLE load_driver(struct testsign_context *ctx, WCHAR *filename, + const WCHAR *resname, const WCHAR *driver_name) { SC_HANDLE manager, service;
@@ -98,6 +275,7 @@ static SC_HANDLE load_driver(WCHAR *filename, const WCHAR *resname, const WCHAR if (service) unload_driver(service);
load_resource(resname, filename); + testsign_sign(ctx, filename); trace("Trying to load driver %s\n", debugstr_w(filename));
service = CreateServiceW(manager, driver_name, driver_name, @@ -616,13 +794,13 @@ static void test_object_info(void) CloseHandle(file); }
-static void test_driver3(void) +static void test_driver3(struct testsign_context *ctx) { WCHAR filename[MAX_PATH]; SC_HANDLE service; BOOL ret;
- service = load_driver(filename, L"driver3.dll", L"WineTestDriver3"); + service = load_driver(ctx, filename, L"driver3.dll", L"WineTestDriver3"); ok(service != NULL, "driver3 failed to load\n");
ret = StartServiceA(service, 0, NULL); @@ -696,7 +874,7 @@ static DWORD WINAPI wsk_test_thread(void *parameter) return TRUE; }
-static void test_driver4(void) +static void test_driver4(struct testsign_context *ctx) { WCHAR filename[MAX_PATH]; SC_HANDLE service; @@ -704,7 +882,7 @@ static void test_driver4(void) DWORD written; BOOL ret;
- if (!(service = load_driver(filename, L"driver4.dll", L"WineTestDriver4"))) + if (!(service = load_driver(ctx, filename, L"driver4.dll", L"WineTestDriver4"))) return;
if (!start_driver(service, TRUE)) @@ -733,26 +911,34 @@ static void test_driver4(void) START_TEST(ntoskrnl) { WCHAR filename[MAX_PATH], filename2[MAX_PATH]; + struct testsign_context ctx; SC_HANDLE service, service2; DWORD written; BOOL ret;
- HMODULE hntdll = GetModuleHandleA("ntdll.dll"); - pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(hntdll, "RtlDosPathNameToNtPathName_U"); - pRtlFreeUnicodeString = (void *)GetProcAddress(hntdll, "RtlFreeUnicodeString"); + pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(GetModuleHandleA("ntdll"), "RtlDosPathNameToNtPathName_U"); + pRtlFreeUnicodeString = (void *)GetProcAddress(GetModuleHandleA("ntdll"), "RtlFreeUnicodeString"); pCancelIoEx = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "CancelIoEx"); pSetFileCompletionNotificationModes = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "SetFileCompletionNotificationModes"); + pSignerSign = (void *)GetProcAddress(LoadLibraryA("mssign32"), "SignerSign"); + + testsign_create_cert(&ctx);
subtest("driver"); - if (!(service = load_driver(filename, L"driver.dll", L"WineTestDriver"))) + if (!(service = load_driver(&ctx, filename, L"driver.dll", L"WineTestDriver"))) + { + testsign_cleanup(&ctx); return; + } + if (!start_driver(service, FALSE)) { DeleteFileW(filename); + testsign_cleanup(&ctx); return; } - service2 = load_driver(filename2, L"driver2.dll", L"WineTestDriver2"); + service2 = load_driver(&ctx, 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()); @@ -783,7 +969,9 @@ START_TEST(ntoskrnl) ret = DeleteFileW(filename2); ok(ret, "DeleteFile failed: %u\n", GetLastError());
- test_driver3(); + test_driver3(&ctx); subtest("driver4"); - test_driver4(); + test_driver4(&ctx); + + testsign_cleanup(&ctx); }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=87572
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driB6A2.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driB6A2.tmp.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:178: Test failed: Failed to add certificate, error 5 ntoskrnl.c:185: Test failed: Failed to add certificate, error 5 ntoskrnl.c:196: Test failed: Failed to remove certificate, error 2147942487 ntoskrnl.c:203: Test failed: Failed to remove certificate, error 2147942487
=== w7u_el (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\driB05B.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\driB05B.tmp.
=== w8 (32 bit report) ===
ntoskrnl.exe: driver.c:250: Test failed: Expected image path name \Device\HarddiskVolume2\Users\winetest\AppData\Local\Temp\dri439C.tmp, got ??\C:\Users\winetest\AppData\Local\Temp\dri439C.tmp.
=== w8adm (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:178: Test failed: Failed to add certificate, error 5 ntoskrnl.c:185: Test failed: Failed to add certificate, error 5 ntoskrnl.c:196: Test failed: Failed to remove certificate, error 2147942487 ntoskrnl.c:203: Test failed: Failed to remove certificate, error 2147942487
=== wvistau64 (64 bit report) ===
ntoskrnl.exe: ntoskrnl.c:238: Test failed: Failed to sign, hr 0x80090008
=== debiant2 (32 bit report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\dri7b4b.tmp.
=== debiant2 (32 bit French report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\drib159.tmp.
=== debiant2 (32 bit Japanese:Japan report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name À, got C:\users\winetest\Temp\drie85b.tmp.
=== debiant2 (32 bit Chinese:China report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name ª, got C:\users\winetest\Temp\dri1be5.tmp.
=== debiant2 (32 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name (, got C:\users\winetest\Temp\dric2dd.tmp.
=== debiant2 (64 bit WoW report) ===
ntoskrnl.exe: driver.c:233: Test failed: Got unexpected status 0xc000003b. driver.c:235: Test failed: Got unexpected status 0xc0000008. driver.c:249: Test failed: Expected image path name (, got C:\users\winetest\Temp\dri109d.tmp.