From: "Rémi Bernon" Subject: [PATCH 3/3] ntoskrnl.exe/tests: Use new winetest library for driver tests. Message-Id: <20210831102559.1981441-3-rbernon@codeweavers.com> Date: Tue, 31 Aug 2021 12:25:59 +0200 In-Reply-To: <20210831102559.1981441-1-rbernon@codeweavers.com> References: <20210831102559.1981441-1-rbernon@codeweavers.com> Signed-off-by: Rémi Bernon --- dlls/ntoskrnl.exe/tests/Makefile.in | 2 +- dlls/ntoskrnl.exe/tests/driver.c | 2 +- dlls/ntoskrnl.exe/tests/driver_hid.c | 2 +- dlls/ntoskrnl.exe/tests/driver_netio.c | 3 +- dlls/ntoskrnl.exe/tests/driver_pnp.c | 2 +- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 571 +------------------------ dlls/ntoskrnl.exe/tests/utils.h | 445 ------------------- 7 files changed, 26 insertions(+), 1001 deletions(-) delete mode 100644 dlls/ntoskrnl.exe/tests/utils.h diff --git a/dlls/ntoskrnl.exe/tests/Makefile.in b/dlls/ntoskrnl.exe/tests/Makefile.in index 85a6925138a..3554998985b 100644 --- a/dlls/ntoskrnl.exe/tests/Makefile.in +++ b/dlls/ntoskrnl.exe/tests/Makefile.in @@ -1,5 +1,5 @@ TESTDLL = ntoskrnl.exe -IMPORTS = advapi32 crypt32 newdev setupapi user32 wintrust ws2_32 hid +IMPORTS = winetest uuid advapi32 crypt32 newdev setupapi user32 wintrust ws2_32 hid driver_IMPORTS = winecrt0 ntoskrnl hal driver_EXTRADLLFLAGS = -nodefaultlibs -nostartfiles -Wl,--subsystem,native diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 0d40053b0e6..e0a3db410cb 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -35,7 +35,7 @@ #include "driver.h" -#include "utils.h" +#include "wine/test_driver.h" /* memcmp() isn't exported from ntoskrnl on i386 */ static int kmemcmp( const void *ptr1, const void *ptr2, size_t n ) diff --git a/dlls/ntoskrnl.exe/tests/driver_hid.c b/dlls/ntoskrnl.exe/tests/driver_hid.c index ed0767877ac..3697859be8f 100644 --- a/dlls/ntoskrnl.exe/tests/driver_hid.c +++ b/dlls/ntoskrnl.exe/tests/driver_hid.c @@ -35,7 +35,7 @@ #include "wine/list.h" #include "driver.h" -#include "utils.h" +#include "wine/test_driver.h" static UNICODE_STRING control_symlink; diff --git a/dlls/ntoskrnl.exe/tests/driver_netio.c b/dlls/ntoskrnl.exe/tests/driver_netio.c index 4ebacc7cf14..c523912127d 100644 --- a/dlls/ntoskrnl.exe/tests/driver_netio.c +++ b/dlls/ntoskrnl.exe/tests/driver_netio.c @@ -33,8 +33,7 @@ #include "ddk/wsk.h" #include "driver.h" - -#include "utils.h" +#include "wine/test_driver.h" static DRIVER_OBJECT *driver_obj; static DEVICE_OBJECT *device_obj; diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index aa078ab0b2f..78f7a51ff76 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -32,7 +32,7 @@ #include "wine/list.h" #include "driver.h" -#include "utils.h" +#include "wine/test_driver.h" static const GUID bus_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc1}}; static const GUID child_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc2}}; diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index dc10497caee..fde0c970bf7 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -36,6 +36,7 @@ #include "setupapi.h" #include "cfgmgr32.h" #include "newdev.h" +#include "objbase.h" #include "dbt.h" #include "initguid.h" #include "devguid.h" @@ -43,17 +44,14 @@ #include "ddk/hidsdi.h" #include "ddk/hidpi.h" #include "wine/test.h" +#include "wine/test_driver.h" #include "wine/heap.h" #include "wine/mssign.h" #include "driver.h" -static const GUID GUID_NULL; - static HANDLE device; -static struct test_data *test_data; - static BOOL (WINAPI *pRtlDosPathNameToNtPathName_U)(const WCHAR *, UNICODE_STRING *, WCHAR **, CURDIR *); static BOOL (WINAPI *pRtlFreeUnicodeString)(UNICODE_STRING *); static BOOL (WINAPI *pCancelIoEx)(HANDLE, OVERLAPPED *); @@ -85,169 +83,7 @@ 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 BOOL 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"); - if (!ctx->root_store && GetLastError() == ERROR_ACCESS_DENIED) - { - skip("Failed to open root store.\n"); - - ret = CertFreeCertificateContext(ctx->cert); - ok(ret, "Failed to free certificate, error %u\n", GetLastError()); - ret = CryptReleaseContext(ctx->provider, 0); - ok(ret, "failed to release context, error %u\n", GetLastError()); - - return FALSE; - } - 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); - if (!ret && GetLastError() == ERROR_ACCESS_DENIED) - { - skip("Failed to add self-signed certificate to store.\n"); - - ret = CertFreeCertificateContext(ctx->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 = CryptReleaseContext(ctx->provider, 0); - ok(ret, "failed to release context, error %u\n", GetLastError()); - - return FALSE; - } - 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()); - - return TRUE; -} - -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 = 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 = 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) +static void testsign_sign(struct winetest_driver_context *ctx, const WCHAR *filename) { SIGNER_ATTR_AUTHCODE authcode = {sizeof(authcode)}; SIGNER_SIGNATURE_INFO signature = {sizeof(signature)}; @@ -294,7 +130,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(struct winetest_driver_context *ctx, WCHAR *filename, const WCHAR *resname, const WCHAR *driver_name) { SC_HANDLE manager, service; @@ -367,28 +203,6 @@ static BOOL start_driver(HANDLE service, BOOL vista_plus) return TRUE; } -static HANDLE okfile; - -static void cat_okfile(void) -{ - char buffer[512]; - DWORD size; - - SetFilePointer(okfile, 0, NULL, FILE_BEGIN); - - do - { - ReadFile(okfile, buffer, sizeof(buffer), &size, NULL); - printf("%.*s", size, buffer); - } while (size == sizeof(buffer)); - - SetFilePointer(okfile, 0, NULL, FILE_BEGIN); - SetEndOfFile(okfile); - - winetest_add_failures(InterlockedExchange(&test_data->failures, 0)); - winetest_add_failures(InterlockedExchange(&test_data->todo_failures, 0)); -} - static ULONG64 modified_value; static void main_test(void) @@ -1127,7 +941,7 @@ static void test_object_info(void) CloseHandle(file); } -static void test_driver3(struct testsign_context *ctx) +static void test_driver3(struct winetest_driver_context *ctx) { WCHAR filename[MAX_PATH]; SC_HANDLE service; @@ -1207,7 +1021,7 @@ static DWORD WINAPI wsk_test_thread(void *parameter) return TRUE; } -static void test_driver_netio(struct testsign_context *ctx) +static void test_driver_netio(struct winetest_driver_context *ctx) { WCHAR filename[MAX_PATH]; SC_HANDLE service; @@ -1236,110 +1050,7 @@ static void test_driver_netio(struct testsign_context *ctx) ret = DeleteFileW(filename); ok(ret, "DeleteFile failed: %u\n", GetLastError()); - cat_okfile(); -} - -#ifdef __i386__ -#define EXT "x86" -#elif defined(__x86_64__) -#define EXT "amd64" -#elif defined(__arm__) -#define EXT "arm" -#elif defined(__aarch64__) -#define EXT "arm64" -#else -#define EXT -#endif - -static const char inf_text[] = - "[Version]\n" - "Signature=$Chicago$\n" - "ClassGuid={4d36e97d-e325-11ce-bfc1-08002be10318}\n" - "CatalogFile=winetest.cat\n" - "DriverVer=09/21/2006,6.0.5736.1\n" - - "[Manufacturer]\n" - "Wine=mfg_section,NT" EXT "\n" - - "[mfg_section.NT" EXT "]\n" - "Wine test root driver=device_section,test_hardware_id\n" - - "[device_section.NT" EXT "]\n" - "CopyFiles=file_section\n" - - "[device_section.NT" EXT ".Services]\n" - "AddService=winetest,0x2,svc_section\n" - - "[file_section]\n" - "winetest.sys\n" - - "[SourceDisksFiles]\n" - "winetest.sys=1\n" - - "[SourceDisksNames]\n" - "1=,winetest.sys\n" - - "[DestinationDirs]\n" - "DefaultDestDir=12\n" - - "[svc_section]\n" - "ServiceBinary=%12%\\winetest.sys\n" - "ServiceType=1\n" - "StartType=3\n" - "ErrorControl=1\n" - "LoadOrderGroup=Extended Base\n" - "DisplayName=\"winetest bus driver\"\n" - "; they don't sleep anymore, on the beach\n"; - -static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) -{ - SIP_SUBJECTINFO subject_info = {sizeof(SIP_SUBJECTINFO)}; - SIP_INDIRECT_DATA *indirect_data; - const WCHAR *filepart = file; - CRYPTCATMEMBER *member; - WCHAR hash_buffer[100]; - GUID subject_guid; - unsigned int i; - DWORD size; - BOOL ret; - - ret = CryptSIPRetrieveSubjectGuidForCatalogFile(file, NULL, &subject_guid); - todo_wine ok(ret, "Failed to get subject guid, error %u\n", GetLastError()); - - size = 0; - subject_info.pgSubjectType = &subject_guid; - subject_info.pwsFileName = file; - subject_info.DigestAlgorithm.pszObjId = (char *)szOID_OIWSEC_sha1; - subject_info.dwFlags = SPC_INC_PE_RESOURCES_FLAG | SPC_INC_PE_IMPORT_ADDR_TABLE_FLAG | SPC_EXC_PE_PAGE_HASHES_FLAG | 0x10000; - ret = CryptSIPCreateIndirectData(&subject_info, &size, NULL); - todo_wine ok(ret, "Failed to get indirect data size, error %u\n", GetLastError()); - - indirect_data = malloc(size); - ret = CryptSIPCreateIndirectData(&subject_info, &size, indirect_data); - todo_wine ok(ret, "Failed to get indirect data, error %u\n", GetLastError()); - if (ret) - { - memset(hash_buffer, 0, sizeof(hash_buffer)); - for (i = 0; i < indirect_data->Digest.cbData; ++i) - swprintf(&hash_buffer[i * 2], 2, L"%02X", indirect_data->Digest.pbData[i]); - - member = CryptCATPutMemberInfo(catalog, (WCHAR *)file, - hash_buffer, &subject_guid, 0, size, (BYTE *)indirect_data); - ok(!!member, "Failed to write member, error %u\n", GetLastError()); - - if (wcsrchr(file, '\\')) - filepart = wcsrchr(file, '\\') + 1; - - ret = !!CryptCATPutAttrInfo(catalog, member, (WCHAR *)L"File", - CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, - (wcslen(filepart) + 1) * 2, (BYTE *)filepart); - ok(ret, "Failed to write attr, error %u\n", GetLastError()); - - ret = !!CryptCATPutAttrInfo(catalog, member, (WCHAR *)L"OSAttr", - CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, - sizeof(L"2:6.0"), (BYTE *)L"2:6.0"); - ok(ret, "Failed to write attr, error %u\n", GetLastError()); - } + winetest_driver_check_failures(); } static const GUID bus_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc1}}; @@ -1698,131 +1409,12 @@ 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(struct winetest_driver_context *ctx) { - static const char hardware_id[] = "test_hardware_id\0"; - char path[MAX_PATH], dest[MAX_PATH], *filepart; - SP_DEVINFO_DATA device = {sizeof(device)}; - char cwd[MAX_PATH], tempdir[MAX_PATH]; - WCHAR driver_filename[MAX_PATH]; - SC_HANDLE manager, service; - BOOL ret, need_reboot; - HANDLE catalog, file; - unsigned int i; - HDEVINFO set; - FILE *f; - - GetCurrentDirectoryA(ARRAY_SIZE(cwd), cwd); - GetTempPathA(ARRAY_SIZE(tempdir), tempdir); - SetCurrentDirectoryA(tempdir); - - load_resource(L"driver_pnp.dll", driver_filename); - ret = MoveFileExW(driver_filename, L"winetest.sys", MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING); - ok(ret, "failed to move file, error %u\n", GetLastError()); - - f = fopen("winetest.inf", "w"); - ok(!!f, "failed to open winetest.inf: %s\n", strerror(errno)); - fputs(inf_text, f); - fclose(f); - - /* Create the catalog file. */ - - catalog = CryptCATOpen((WCHAR *)L"winetest.cat", CRYPTCAT_OPEN_CREATENEW, 0, CRYPTCAT_VERSION_1, 0); - ok(catalog != INVALID_HANDLE_VALUE, "Failed to create catalog, error %#x\n", GetLastError()); - - ret = !!CryptCATPutCatAttrInfo(catalog, (WCHAR *)L"HWID1", - CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, - sizeof(L"test_hardware_id"), (BYTE *)L"test_hardware_id"); - todo_wine ok(ret, "failed to add attribute, error %#x\n", GetLastError()); - - ret = !!CryptCATPutCatAttrInfo(catalog, (WCHAR *)L"OS", - CRYPTCAT_ATTR_NAMEASCII | CRYPTCAT_ATTR_DATAASCII | CRYPTCAT_ATTR_AUTHENTICATED, - sizeof(L"VistaX64"), (BYTE *)L"VistaX64"); - todo_wine ok(ret, "failed to add attribute, error %#x\n", GetLastError()); - - add_file_to_catalog(catalog, L"winetest.sys"); - add_file_to_catalog(catalog, L"winetest.inf"); - - ret = CryptCATPersistStore(catalog); - todo_wine ok(ret, "Failed to write catalog, error %u\n", GetLastError()); - - ret = CryptCATClose(catalog); - ok(ret, "Failed to close catalog, error %u\n", GetLastError()); - - testsign_sign(ctx, L"winetest.cat"); - - /* Install the driver. */ - - set = SetupDiCreateDeviceInfoList(NULL, NULL); - ok(set != INVALID_HANDLE_VALUE, "failed to create device list, error %#x\n", GetLastError()); - - ret = SetupDiCreateDeviceInfoA(set, "root\\winetest\\0", &GUID_NULL, NULL, NULL, 0, &device); - ok(ret, "failed to create device, error %#x\n", GetLastError()); - - ret = SetupDiSetDeviceRegistryPropertyA( set, &device, SPDRP_HARDWAREID, - (const BYTE *)hardware_id, sizeof(hardware_id) ); - ok(ret, "failed to create set hardware ID, error %#x\n", GetLastError()); - - ret = SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device); - ok(ret, "failed to register device, error %#x\n", GetLastError()); - - GetFullPathNameA("winetest.inf", sizeof(path), path, NULL); - ret = UpdateDriverForPlugAndPlayDevicesA(NULL, hardware_id, path, INSTALLFLAG_FORCE, &need_reboot); - ok(ret, "failed to install device, error %#x\n", GetLastError()); - ok(!need_reboot, "expected no reboot necessary\n"); - - /* Tests. */ - + if (!winetest_driver_start(ctx, L"driver_pnp.dll")) + return; test_pnp_devices(); - - /* Clean up. */ - - ret = SetupDiCallClassInstaller(DIF_REMOVE, set, &device); - ok(ret, "failed to remove device, error %#x\n", GetLastError()); - - file = CreateFileA("\\\\?\\root#winetest#0#{deadbeef-29ef-4538-a5fd-b69573a362c0}", 0, 0, NULL, OPEN_EXISTING, 0, NULL); - ok(file == INVALID_HANDLE_VALUE, "expected failure\n"); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "got error %u\n", GetLastError()); - - ret = SetupDiDestroyDeviceInfoList(set); - ok(ret, "failed to destroy set, error %#x\n", GetLastError()); - - set = SetupDiGetClassDevsA(NULL, "wine", NULL, DIGCF_ALLCLASSES); - ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError()); - - for (i = 0; SetupDiEnumDeviceInfo(set, i, &device); ++i) - { - ret = SetupDiCallClassInstaller(DIF_REMOVE, set, &device); - ok(ret, "failed to remove device, error %#x\n", GetLastError()); - } - - /* Windows stops the service but does not delete it. */ - manager = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); - ok(!!manager, "failed to open service manager, error %u\n", GetLastError()); - service = OpenServiceA(manager, "winetest", SERVICE_STOP | DELETE); - ok(!!service, "failed to open service, error %u\n", GetLastError()); - unload_driver(service); - CloseServiceHandle(manager); - - cat_okfile(); - - GetFullPathNameA("winetest.inf", sizeof(path), path, NULL); - ret = SetupCopyOEMInfA(path, NULL, 0, 0, dest, sizeof(dest), NULL, &filepart); - ok(ret, "Failed to copy INF, error %#x\n", GetLastError()); - ret = SetupUninstallOEMInfA(filepart, 0, NULL); - ok(ret, "Failed to uninstall INF, error %u\n", GetLastError()); - - ret = DeleteFileA("winetest.cat"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - ret = DeleteFileA("winetest.inf"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - ret = DeleteFileA("winetest.sys"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - /* Windows 10 apparently deletes the image in SetupUninstallOEMInf(). */ - ret = DeleteFileA("C:/windows/system32/drivers/winetest.sys"); - ok(ret || GetLastError() == ERROR_FILE_NOT_FOUND, "Failed to delete file, error %u\n", GetLastError()); - - SetCurrentDirectoryA(cwd); + winetest_driver_stop(ctx); } #define check_member_(file, line, val, exp, fmt, member) \ @@ -3295,24 +2887,10 @@ 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(struct winetest_driver_context *ctx, DWORD report_id, DWORD polled) { - static const char hardware_id[] = "test_hardware_id\0"; - char path[MAX_PATH], dest[MAX_PATH], *filepart; - SP_DEVINFO_DATA device = {sizeof(device)}; - char cwd[MAX_PATH], tempdir[MAX_PATH]; - WCHAR driver_filename[MAX_PATH]; - SC_HANDLE manager, service; - BOOL ret, need_reboot; - HANDLE catalog, file; LSTATUS status; - HDEVINFO set; HKEY hkey; - FILE *f; - - GetCurrentDirectoryA(ARRAY_SIZE(cwd), cwd); - GetTempPathA(ARRAY_SIZE(tempdir), tempdir); - SetCurrentDirectoryA(tempdir); status = RegCreateKeyExW(HKEY_LOCAL_MACHINE, L"System\\CurrentControlSet\\Services\\winetest", 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL); ok(!status, "RegCreateKeyExW returned %#x\n", status); @@ -3323,104 +2901,19 @@ 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); - load_resource(L"driver_hid.dll", driver_filename); - ret = MoveFileExW(driver_filename, L"winetest.sys", MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING); - ok(ret, "failed to move file, error %u\n", GetLastError()); - - f = fopen("winetest.inf", "w"); - ok(!!f, "failed to open winetest.inf: %s\n", strerror(errno)); - fputs(inf_text, f); - fclose(f); - - /* Create the catalog file. */ - - catalog = CryptCATOpen((WCHAR *)L"winetest.cat", CRYPTCAT_OPEN_CREATENEW, 0, CRYPTCAT_VERSION_1, 0); - ok(catalog != INVALID_HANDLE_VALUE, "Failed to create catalog, error %#x\n", GetLastError()); - - add_file_to_catalog(catalog, L"winetest.sys"); - add_file_to_catalog(catalog, L"winetest.inf"); - - ret = CryptCATPersistStore(catalog); - todo_wine ok(ret, "Failed to write catalog, error %u\n", GetLastError()); - - ret = CryptCATClose(catalog); - ok(ret, "Failed to close catalog, error %u\n", GetLastError()); - - testsign_sign(ctx, L"winetest.cat"); - - /* Install the driver. */ - - set = SetupDiCreateDeviceInfoList(NULL, NULL); - ok(set != INVALID_HANDLE_VALUE, "failed to create device list, error %#x\n", GetLastError()); - - ret = SetupDiCreateDeviceInfoA(set, "root\\winetest\\0", &GUID_NULL, NULL, NULL, 0, &device); - ok(ret, "failed to create device, error %#x\n", GetLastError()); - - ret = SetupDiSetDeviceRegistryPropertyA( set, &device, SPDRP_HARDWAREID, - (const BYTE *)hardware_id, sizeof(hardware_id) ); - ok(ret, "failed to create set hardware ID, error %#x\n", GetLastError()); - - ret = SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device); - ok(ret, "failed to register device, error %#x\n", GetLastError()); - - GetFullPathNameA("winetest.inf", sizeof(path), path, NULL); - ret = UpdateDriverForPlugAndPlayDevicesA(NULL, hardware_id, path, INSTALLFLAG_FORCE, &need_reboot); - ok(ret, "failed to install device, error %#x\n", GetLastError()); - ok(!need_reboot, "expected no reboot necessary\n"); - - /* Tests. */ - + if (!winetest_driver_start(ctx, L"driver_hid.dll")) + return; test_hid_device(report_id, polled); - - /* Clean up. */ - - ret = SetupDiCallClassInstaller(DIF_REMOVE, set, &device); - ok(ret, "failed to remove device, error %#x\n", GetLastError()); - - file = CreateFileA("\\\\?\\root#winetest#0#{deadbeef-29ef-4538-a5fd-b69573a362c0}", 0, 0, NULL, OPEN_EXISTING, 0, NULL); - ok(file == INVALID_HANDLE_VALUE, "expected failure\n"); - ok(GetLastError() == ERROR_FILE_NOT_FOUND, "got error %u\n", GetLastError()); - - ret = SetupDiDestroyDeviceInfoList(set); - ok(ret, "failed to destroy set, error %#x\n", GetLastError()); - - /* Windows stops the service but does not delete it. */ - manager = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); - ok(!!manager, "failed to open service manager, error %u\n", GetLastError()); - service = OpenServiceA(manager, "winetest", SERVICE_STOP | DELETE); - ok(!!service, "failed to open service, error %u\n", GetLastError()); - unload_driver(service); - CloseServiceHandle(manager); - - cat_okfile(); - - GetFullPathNameA("winetest.inf", sizeof(path), path, NULL); - ret = SetupCopyOEMInfA(path, NULL, 0, 0, dest, sizeof(dest), NULL, &filepart); - ok(ret, "Failed to copy INF, error %#x\n", GetLastError()); - ret = SetupUninstallOEMInfA(filepart, 0, NULL); - ok(ret, "Failed to uninstall INF, error %u\n", GetLastError()); - - ret = DeleteFileA("winetest.cat"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - ret = DeleteFileA("winetest.inf"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - ret = DeleteFileA("winetest.sys"); - ok(ret, "Failed to delete file, error %u\n", GetLastError()); - /* Windows 10 apparently deletes the image in SetupUninstallOEMInf(). */ - ret = DeleteFileA("C:/windows/system32/drivers/winetest.sys"); - ok(ret || GetLastError() == ERROR_FILE_NOT_FOUND, "Failed to delete file, error %u\n", GetLastError()); - - SetCurrentDirectoryA(cwd); + winetest_driver_stop(ctx); } START_TEST(ntoskrnl) { WCHAR filename[MAX_PATH], filename2[MAX_PATH]; - struct testsign_context ctx; + struct winetest_driver_context ctx; SC_HANDLE service, service2; - BOOL ret, is_wow64; - HANDLE mapping; DWORD written; + BOOL ret; pRtlDosPathNameToNtPathName_U = (void *)GetProcAddress(GetModuleHandleA("ntdll"), "RtlDosPathNameToNtPathName_U"); pRtlFreeUnicodeString = (void *)GetProcAddress(GetModuleHandleA("ntdll"), "RtlFreeUnicodeString"); @@ -3428,29 +2921,11 @@ START_TEST(ntoskrnl) pIsWow64Process = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "IsWow64Process"); pSetFileCompletionNotificationModes = (void *)GetProcAddress(GetModuleHandleA("kernel32.dll"), "SetFileCompletionNotificationModes"); - pSignerSign = (void *)GetProcAddress(LoadLibraryA("mssign32"), "SignerSign"); - - if (IsWow64Process(GetCurrentProcess(), &is_wow64) && is_wow64) - { - skip("Running in WoW64.\n"); - return; - } + pSignerSign = (void *)GetProcAddress(LoadLibraryW(L"mssign32"), "SignerSign"); - if (!testsign_create_cert(&ctx)) + if (!winetest_driver_init(&ctx)) return; - mapping = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, - 0, sizeof(*test_data), "Global\\winetest_ntoskrnl_section"); - ok(!!mapping, "got error %u\n", GetLastError()); - test_data = MapViewOfFile(mapping, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 1024); - test_data->running_under_wine = !strcmp(winetest_platform, "wine"); - test_data->winetest_report_success = winetest_report_success; - test_data->winetest_debug = winetest_debug; - - okfile = CreateFileA("C:\\windows\\winetest_ntoskrnl_okfile", GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 0, NULL); - 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"))) goto out; @@ -3490,7 +2965,7 @@ START_TEST(ntoskrnl) ret = DeleteFileW(filename2); ok(ret, "DeleteFile failed: %u\n", GetLastError()); - cat_okfile(); + winetest_driver_check_failures(); test_driver3(&ctx); subtest("driver_netio"); @@ -3506,9 +2981,5 @@ START_TEST(ntoskrnl) test_hid_driver(&ctx, 1, TRUE); out: - testsign_cleanup(&ctx); - UnmapViewOfFile(test_data); - CloseHandle(mapping); - CloseHandle(okfile); - DeleteFileA("C:\\windows\\winetest_ntoskrnl_okfile"); + winetest_driver_cleanup(&ctx); } diff --git a/dlls/ntoskrnl.exe/tests/utils.h b/dlls/ntoskrnl.exe/tests/utils.h deleted file mode 100644 index de632c65b7c..00000000000 --- a/dlls/ntoskrnl.exe/tests/utils.h +++ /dev/null @@ -1,445 +0,0 @@ -/* - * ntoskrnl.exe testing framework - * - * Copyright 2015 Sebastian Lackner - * Copyright 2015 Michael Müller - * Copyright 2015 Christian Costa - * Copyright 2020 Paul Gofman for CodeWeavers - * Copyright 2020-2021 Zebediah Figura for CodeWeavers - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include -#include -#include -#include -#include - -#include - -#if !defined(__WINE_USE_MSVCRT) || defined(__MINGW32__) -#define __WINE_PRINTF_ATTR(fmt,args) __attribute__((format (printf,fmt,args))) -#else -#define __WINE_PRINTF_ATTR(fmt,args) -#endif - -static HANDLE okfile; -static LONG successes; -static LONG failures; -static LONG skipped; -static LONG todo_successes; -static LONG todo_failures; -static LONG muted_traces; -static LONG muted_skipped; -static LONG muted_todo_successes; - -static int running_under_wine; -static int winetest_debug; -static int winetest_report_success; - -/* silence todos and skips above this threshold */ -static int winetest_mute_threshold = 42; - -/* counts how many times a given line printed a message */ -static LONG line_counters[16384]; - -/* The following data must be kept track of on a per-thread basis */ -struct tls_data -{ - HANDLE thread; - const char* current_file; /* file of current check */ - int current_line; /* line of current check */ - unsigned int todo_level; /* current todo nesting level */ - int todo_do_loop; - char *str_pos; /* position in debug buffer */ - char strings[2000]; /* buffer for debug strings */ - char context[8][128]; /* data to print before messages */ - unsigned int context_count; /* number of context prefixes */ -}; - -static KSPIN_LOCK tls_data_lock; -static struct tls_data tls_data_pool[128]; -static DWORD tls_data_count; - -static inline struct tls_data *get_tls_data(void) -{ - static struct tls_data tls_overflow; - struct tls_data *data; - HANDLE thread = PsGetCurrentThreadId(); - KIRQL irql; - - KeAcquireSpinLock(&tls_data_lock, &irql); - for (data = tls_data_pool; data != tls_data_pool + tls_data_count; ++data) - if (data->thread == thread) break; - if (data == tls_data_pool + ARRAY_SIZE(tls_data_pool)) - data = &tls_overflow; - else if (data == tls_data_pool + tls_data_count) - { - data->thread = thread; - data->str_pos = data->strings; - tls_data_count++; - } - KeReleaseSpinLock(&tls_data_lock, irql); - - return data; -} - -static inline void winetest_set_location( const char* file, int line ) -{ - struct tls_data *data = get_tls_data(); - data->current_file=strrchr(file,'/'); - if (data->current_file==NULL) - data->current_file=strrchr(file,'\\'); - if (data->current_file==NULL) - data->current_file=file; - else - data->current_file++; - data->current_line=line; -} - -static inline void kvprintf(const char *format, __ms_va_list ap) -{ - struct tls_data *data = get_tls_data(); - IO_STATUS_BLOCK io; - int len = vsnprintf(data->strings, sizeof(data->strings), format, ap); - ZwWriteFile(okfile, NULL, NULL, NULL, &io, data->strings, len, NULL, NULL); -} - -static inline void WINAPIV kprintf(const char *format, ...) __WINE_PRINTF_ATTR(1,2); -static inline void WINAPIV kprintf(const char *format, ...) -{ - __ms_va_list valist; - - __ms_va_start(valist, format); - kvprintf(format, valist); - __ms_va_end(valist); -} - -static inline void WINAPIV winetest_printf( const char *msg, ... ) __WINE_PRINTF_ATTR(1,2); -static inline void WINAPIV winetest_printf( const char *msg, ... ) -{ - struct tls_data *data = get_tls_data(); - __ms_va_list valist; - - kprintf( "%s:%d: ", data->current_file, data->current_line ); - __ms_va_start( valist, msg ); - kvprintf( msg, valist ); - __ms_va_end( valist ); -} - -static inline NTSTATUS winetest_init(void) -{ - const struct test_data *data; - SIZE_T size = sizeof(*data); - OBJECT_ATTRIBUTES attr; - UNICODE_STRING string; - IO_STATUS_BLOCK io; - void *addr = NULL; - HANDLE section; - NTSTATUS ret; - - KeInitializeSpinLock(&tls_data_lock); - - RtlInitUnicodeString(&string, L"\\BaseNamedObjects\\winetest_ntoskrnl_section"); - /* OBJ_KERNEL_HANDLE is necessary for the file to be accessible from system threads */ - InitializeObjectAttributes(&attr, &string, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, NULL); - if ((ret = ZwOpenSection(§ion, SECTION_MAP_READ, &attr))) - return ret; - - if ((ret = ZwMapViewOfSection(section, NtCurrentProcess(), &addr, - 0, 0, NULL, &size, ViewUnmap, 0, PAGE_READONLY))) - { - ZwClose(section); - return ret; - } - data = addr; - running_under_wine = data->running_under_wine; - winetest_debug = data->winetest_debug; - winetest_report_success = data->winetest_report_success; - - ZwUnmapViewOfSection(NtCurrentProcess(), addr); - ZwClose(section); - - RtlInitUnicodeString(&string, L"\\??\\C:\\windows\\winetest_ntoskrnl_okfile"); - return ZwOpenFile(&okfile, FILE_APPEND_DATA | SYNCHRONIZE, &attr, &io, - FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_SYNCHRONOUS_IO_NONALERT); -} - -#define winetest_cleanup() winetest_cleanup_(__FILE__) -static inline void winetest_cleanup_(const char *file) -{ - char test_name[MAX_PATH], *tmp; - struct test_data *data; - SIZE_T size = sizeof(*data); - const char *source_file; - OBJECT_ATTRIBUTES attr; - UNICODE_STRING string; - void *addr = NULL; - HANDLE section; - - source_file = strrchr(file, '/'); - if (!source_file) source_file = strrchr(file, '\\'); - if (!source_file) source_file = file; - else source_file++; - - strcpy(test_name, source_file); - if ((tmp = strrchr(test_name, '.'))) *tmp = 0; - - if (winetest_debug) - { - kprintf("%04x:%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n", - (DWORD)(DWORD_PTR)PsGetCurrentProcessId(), test_name, - successes + failures + todo_successes + todo_failures, - todo_successes, failures + todo_failures, - (failures + todo_failures != 1) ? "failures" : "failure", skipped ); - } - - RtlInitUnicodeString(&string, L"\\BaseNamedObjects\\winetest_ntoskrnl_section"); - /* OBJ_KERNEL_HANDLE is necessary for the file to be accessible from system threads */ - InitializeObjectAttributes(&attr, &string, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, NULL); - - if (!ZwOpenSection(§ion, SECTION_MAP_READ | SECTION_MAP_WRITE, &attr)) - { - if (!ZwMapViewOfSection(section, NtCurrentProcess(), &addr, - 0, 0, NULL, &size, ViewUnmap, 0, PAGE_READWRITE)) - { - data = addr; - - InterlockedExchangeAdd(&data->failures, failures); - InterlockedExchangeAdd(&data->todo_failures, todo_failures); - - ZwUnmapViewOfSection(NtCurrentProcess(), addr); - } - ZwClose(section); - } - - ZwClose(okfile); -} - -static inline void winetest_print_context( const char *msgtype ) -{ - struct tls_data *data = get_tls_data(); - unsigned int i; - - winetest_printf( "%s", msgtype ); - for (i = 0; i < data->context_count; ++i) - kprintf( "%s: ", data->context[i] ); -} - -static inline LONG winetest_add_line( void ) -{ - struct tls_data *data; - int index, count; - - if (winetest_debug > 1) - return 0; - - data = get_tls_data(); - index = data->current_line % ARRAY_SIZE(line_counters); - count = InterlockedIncrement(line_counters + index) - 1; - if (count == winetest_mute_threshold) - winetest_printf( "Line has been silenced after %d occurrences\n", winetest_mute_threshold ); - - return count; -} - -static inline int winetest_vok( int condition, const char *msg, __ms_va_list args ) -{ - struct tls_data *data = get_tls_data(); - - if (data->todo_level) - { - if (condition) - { - winetest_print_context( "Test succeeded inside todo block: " ); - kvprintf(msg, args); - InterlockedIncrement(&todo_failures); - return 0; - } - else - { - if (!winetest_debug || - winetest_add_line() < winetest_mute_threshold) - { - if (winetest_debug > 0) - { - winetest_print_context( "Test marked todo: " ); - kvprintf(msg, args); - } - InterlockedIncrement(&todo_successes); - } - else - InterlockedIncrement(&muted_todo_successes); - return 1; - } - } - else - { - if (!condition) - { - winetest_print_context( "Test failed: " ); - kvprintf(msg, args); - InterlockedIncrement(&failures); - return 0; - } - else - { - if (winetest_report_success) - winetest_printf("Test succeeded\n"); - InterlockedIncrement(&successes); - return 1; - } - } -} - -static inline void WINAPIV winetest_ok( int condition, const char *msg, ... ) __WINE_PRINTF_ATTR(2,3); -static inline void WINAPIV winetest_ok( int condition, const char *msg, ... ) -{ - __ms_va_list args; - __ms_va_start(args, msg); - winetest_vok(condition, msg, args); - __ms_va_end(args); -} - -static inline void winetest_vskip( const char *msg, __ms_va_list args ) -{ - if (winetest_add_line() < winetest_mute_threshold) - { - winetest_print_context( "Tests skipped: " ); - kvprintf(msg, args); - InterlockedIncrement(&skipped); - } - else - InterlockedIncrement(&muted_skipped); -} - -static inline void WINAPIV winetest_skip( const char *msg, ... ) __WINE_PRINTF_ATTR(1,2); -static inline void WINAPIV winetest_skip( const char *msg, ... ) -{ - __ms_va_list args; - __ms_va_start(args, msg); - winetest_vskip(msg, args); - __ms_va_end(args); -} - -static inline void WINAPIV winetest_win_skip( const char *msg, ... ) __WINE_PRINTF_ATTR(1,2); -static inline void WINAPIV winetest_win_skip( const char *msg, ... ) -{ - __ms_va_list args; - __ms_va_start(args, msg); - if (running_under_wine) - winetest_vskip(msg, args); - else - winetest_vok(0, msg, args); - __ms_va_end(args); -} - -static inline void WINAPIV winetest_trace( const char *msg, ... ) __WINE_PRINTF_ATTR(1,2); -static inline void WINAPIV winetest_trace( const char *msg, ... ) -{ - __ms_va_list args; - - if (!winetest_debug) - return; - if (winetest_add_line() < winetest_mute_threshold) - { - winetest_print_context( "" ); - __ms_va_start(args, msg); - kvprintf( msg, args ); - __ms_va_end(args); - } - else - InterlockedIncrement(&muted_traces); -} - -static inline void winetest_start_todo( int is_todo ) -{ - struct tls_data *data = get_tls_data(); - data->todo_level = (data->todo_level << 1) | (is_todo != 0); - data->todo_do_loop=1; -} - -static inline int winetest_loop_todo(void) -{ - struct tls_data *data = get_tls_data(); - int do_loop=data->todo_do_loop; - data->todo_do_loop=0; - return do_loop; -} - -static inline void winetest_end_todo(void) -{ - struct tls_data *data = get_tls_data(); - data->todo_level >>= 1; -} - -static inline void WINAPIV winetest_push_context( const char *fmt, ... ) __WINE_PRINTF_ATTR(1, 2); -static inline void WINAPIV winetest_push_context( const char *fmt, ... ) -{ - struct tls_data *data = get_tls_data(); - __ms_va_list valist; - - if (data->context_count < ARRAY_SIZE(data->context)) - { - __ms_va_start(valist, fmt); - vsnprintf( data->context[data->context_count], sizeof(data->context[data->context_count]), fmt, valist ); - __ms_va_end(valist); - data->context[data->context_count][sizeof(data->context[data->context_count]) - 1] = 0; - } - ++data->context_count; -} - -static inline void winetest_pop_context(void) -{ - struct tls_data *data = get_tls_data(); - - if (data->context_count) - --data->context_count; -} - -static inline int broken(int condition) -{ - return !running_under_wine && condition; -} - -#ifdef WINETEST_NO_LINE_NUMBERS -# define subtest_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_subtest -# define ignore_exceptions_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_ignore_exceptions -# define ok_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_ok -# define skip_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_skip -# define win_skip_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_win_skip -# define trace_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_trace -# define wait_child_process_(file, line) (winetest_set_location(file, 0), 0) ? (void)0 : winetest_wait_child_process -#else -# define subtest_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_subtest -# define ignore_exceptions_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ignore_exceptions -# define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok -# define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip -# define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip -# define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace -# define wait_child_process_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_wait_child_process -#endif - -#define ok ok_(__FILE__, __LINE__) -#define skip skip_(__FILE__, __LINE__) -#define trace trace_(__FILE__, __LINE__) -#define win_skip win_skip_(__FILE__, __LINE__) - -#define todo_if(is_todo) for (winetest_start_todo(is_todo); \ - winetest_loop_todo(); \ - winetest_end_todo()) -#define todo_wine todo_if(running_under_wine) -#define todo_wine_if(is_todo) todo_if((is_todo) && running_under_wine) -- 2.33.0