1 /*
2  * PROJECT:     ReactOS api tests
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Test for SfcGetFiles
5  * COPYRIGHT:   Copyright 2018 Mark Jansen (mark.jansen@reactos.org)
6  */
7 
8 #include <apitest.h>
9 #include <strsafe.h>
10 #include <ndk/umtypes.h>
11 
12 typedef struct _PROTECT_FILE_ENTRY {
13     PWSTR SourceFileName;
14     PWSTR FileName;
15     PWSTR InfName;
16 } PROTECT_FILE_ENTRY, *PPROTECT_FILE_ENTRY;
17 
18 NTSTATUS (WINAPI *SfcGetFiles)(PPROTECT_FILE_ENTRY* ProtFileData, PULONG FileCount);
19 
20 PCWSTR wszEnvVars[] =
21 {
22     L"%systemroot%",
23     L"%commonprogramfiles%",
24     L"%ProgramFiles%",
25     L"%systemdrive%"
26 };
27 
28 static void Test_GetFiles()
29 {
30     PPROTECT_FILE_ENTRY FileData;
31     PCWSTR Ptr;
32     ULONG FileCount, n, j;
33     NTSTATUS Status;
34 
35     Status = SfcGetFiles(&FileData, &FileCount);
36     ok(NT_SUCCESS(Status), "SfcGetFiles failed: 0x%lx\n", Status);
37 
38     if (!NT_SUCCESS(Status))
39         return;
40 
41     for (n = 0; n < FileCount; ++n)
42     {
43         PPROTECT_FILE_ENTRY Entry = FileData + n;
44 
45         ok(Entry->FileName != NULL, "Entry %lu without FileName!", n);
46         if (Entry->FileName)
47         {
48             Ptr = NULL;
49             for (j = 0; j < _countof(wszEnvVars); ++j)
50             {
51                 Ptr = wcsstr(Entry->FileName, wszEnvVars[j]);
52                 if (Ptr)
53                     break;
54             }
55             ok(Ptr != NULL, "Expected to find one match from wszEnvVars in %s\n", wine_dbgstr_w(Entry->FileName));
56         }
57         if (Entry->InfName)
58         {
59             Ptr = wcsstr(Entry->InfName, L".inf");
60             ok(Ptr == (Entry->InfName + wcslen(Entry->InfName) - 4),
61                ".inf not found in %s\n", wine_dbgstr_w(Entry->InfName));
62         }
63     }
64 }
65 
66 START_TEST(SfcGetFiles)
67 {
68     HMODULE mod;
69 
70     mod = LoadLibraryA("sfcfiles.dll");
71     if (!mod)
72     {
73         skip("sfcfiles.dll not found\n");
74         return;
75     }
76 
77     SfcGetFiles = (void*)GetProcAddress(mod, "SfcGetFiles");
78     ok(SfcGetFiles != NULL, "Function not exported!\n");
79     if (!SfcGetFiles)
80         return;
81 
82     Test_GetFiles();
83 }
84