[PATCH 02/10] ntoskrnl.exe/tests: Factor out driver start / stop sequence.

Rémi Bernon rbernon at codeweavers.com
Thu Sep 2 02:24:16 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntoskrnl.exe/tests/ntoskrnl.c | 323 +++++++++++------------------
 1 file changed, 116 insertions(+), 207 deletions(-)

diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index e3afd46181c..bd16038073f 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -1345,6 +1345,118 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file)
     }
 }
 
+static void driver_stop(void)
+{
+    SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
+    WCHAR path[MAX_PATH], dest[MAX_PATH], *filepart;
+    SC_HANDLE manager, service;
+    HDEVINFO set;
+    HANDLE file;
+    BOOL ret;
+
+    set = SetupDiCreateDeviceInfoList(NULL, NULL);
+    ok(set != INVALID_HANDLE_VALUE, "failed to create device list, error %u\n", GetLastError());
+
+    ret = SetupDiOpenDeviceInfoW(set, L"root\\winetest\\0", NULL, 0, &device);
+    ok(ret, "failed to open device, error %u\n", GetLastError());
+
+    ret = SetupDiCallClassInstaller(DIF_REMOVE, set, &device);
+    ok(ret, "failed to remove device, error %u\n", GetLastError());
+
+    file = CreateFileW(L"\\\\?\\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 %u\n", GetLastError());
+
+    /* Windows stops the service but does not delete it. */
+    manager = OpenSCManagerW(NULL, NULL, SC_MANAGER_CONNECT);
+    ok(!!manager, "failed to open service manager, error %u\n", GetLastError());
+    service = OpenServiceW(manager, L"winetest", SERVICE_STOP | DELETE);
+    ok(!!service, "failed to open service, error %u\n", GetLastError());
+
+    unload_driver(service);
+    CloseServiceHandle(manager);
+
+    cat_okfile();
+
+    GetFullPathNameW(L"winetest.inf", sizeof(path), path, NULL);
+    ret = SetupCopyOEMInfW(path, NULL, 0, 0, dest, sizeof(dest), NULL, &filepart);
+    ok(ret, "Failed to copy INF, error %u\n", GetLastError());
+    ret = SetupUninstallOEMInfW(filepart, 0, NULL);
+    ok(ret, "Failed to uninstall INF, error %u\n", GetLastError());
+
+    ret = DeleteFileW(L"winetest.cat");
+    ok(ret, "Failed to delete file, error %u\n", GetLastError());
+    ret = DeleteFileW(L"winetest.inf");
+    ok(ret, "Failed to delete file, error %u\n", GetLastError());
+    ret = DeleteFileW(L"winetest.sys");
+    ok(ret, "Failed to delete file, error %u\n", GetLastError());
+    /* Windows 10 apparently deletes the image in SetupUninstallOEMInf(). */
+    ret = DeleteFileW(L"C:/windows/system32/drivers/winetest.sys");
+    ok(ret || GetLastError() == ERROR_FILE_NOT_FOUND, "Failed to delete file, error %u\n", GetLastError());
+}
+
+static void driver_start(struct testsign_context *ctx, const WCHAR *resource)
+{
+    static const WCHAR hardware_id[] = L"test_hardware_id\0";
+    SP_DEVINFO_DATA device = {sizeof(SP_DEVINFO_DATA)};
+    WCHAR path[MAX_PATH], filename[MAX_PATH];
+    BOOL ret, need_reboot;
+    HANDLE catalog;
+    HDEVINFO set;
+    FILE *f;
+
+    load_resource(resource, filename);
+    ret = MoveFileExW(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 %u\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 %u\n", GetLastError());
+
+    ret = SetupDiCreateDeviceInfoW(set, L"root\\winetest\\0", &GUID_NULL, NULL, NULL, 0, &device);
+    ok(ret, "failed to create device, error %u\n", GetLastError());
+
+    ret = SetupDiSetDeviceRegistryPropertyW( set, &device, SPDRP_HARDWAREID,
+            (const BYTE *)hardware_id, sizeof(hardware_id) );
+    ok(ret, "failed to create set hardware ID, error %u\n", GetLastError());
+
+    ret = SetupDiCallClassInstaller(DIF_REGISTERDEVICE, set, &device);
+    ok(ret, "failed to register device, error %u\n", GetLastError());
+
+    ret = SetupDiDestroyDeviceInfoList(set);
+    ok(ret, "failed to destroy set, error %u\n", GetLastError());
+
+    GetFullPathNameW(L"winetest.inf", sizeof(path), path, NULL);
+    ret = UpdateDriverForPlugAndPlayDevicesW(NULL, hardware_id, path, INSTALLFLAG_FORCE, &need_reboot);
+    ok(ret, "failed to install device, error %u\n", GetLastError());
+    ok(!need_reboot, "expected no reboot necessary\n");
+}
+
 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}};
 
@@ -1703,127 +1815,16 @@ static void test_pnp_devices(void)
 
 static void test_pnp_driver(struct testsign_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. */
-
+    driver_start(ctx, L"driver_pnp.dll");
     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());
+    driver_stop();
 
     SetCurrentDirectoryA(cwd);
 }
@@ -3300,18 +3301,9 @@ static void test_hid_device(DWORD report_id, DWORD polled)
 
 static void test_hid_driver(struct testsign_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);
@@ -3326,92 +3318,9 @@ 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. */
-
+    driver_start(ctx, L"driver_hid.dll");
     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());
+    driver_stop();
 
     SetCurrentDirectoryA(cwd);
 }
-- 
2.33.0




More information about the wine-devel mailing list