[PSAPI_APITEST]
[reactos.git] / rostests / apitests / psapi / psapi.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for GetDeviceDriverFileName
5 * PROGRAMMER: Pierre Schweitzer
6 */
7
8 #include <apitest.h>
9 #include <psapi.h>
10 #include <tlhelp32.h>
11 #include <stdio.h>
12
13 typedef struct
14 {
15 LPVOID ImageBase;
16 CHAR Path[255];
17 DWORD Len;
18 } TEST_MODULE_INFO;
19
20 static LPVOID IntGetImageBase(LPCSTR Image)
21 {
22 HANDLE Snap;
23 MODULEENTRY32 Module;
24
25 Snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0);
26 if (Snap == INVALID_HANDLE_VALUE)
27 {
28 return (LPVOID)0x00000000;
29 }
30
31 Module.dwSize = sizeof(MODULEENTRY32);
32 if(!Module32First(Snap, &Module))
33 {
34 CloseHandle(Snap);
35 return (LPVOID)0x00000000;
36 }
37
38 do
39 {
40 if (lstrcmpiA(Module.szExePath, Image) == 0)
41 {
42 CloseHandle(Snap);
43 return (LPVOID)Module.modBaseAddr;
44 }
45 } while(Module32Next(Snap, &Module));
46
47 CloseHandle(Snap);
48 return (LPVOID)0x00000000;
49 }
50
51 static BOOLEAN IntGetModuleInformation(LPCSTR Module, BOOLEAN IsDriver, BOOLEAN IsProcMod, TEST_MODULE_INFO * Info)
52 {
53 CHAR System[255];
54 UINT Len;
55
56 memset(Info, 0, sizeof(TEST_MODULE_INFO));
57
58 /* Get system path */
59 Len = GetSystemWindowsDirectory(System, 255);
60 if (Len > 255 || Len == 0)
61 {
62 printf("GetSystemWindowsDirectory failed\n");
63 return FALSE;
64 }
65
66 /* Make path to module */
67 strcat(System, "\\system32\\");
68 if (IsDriver) strcat(System, "drivers\\");
69 strcat(System, Module);
70
71 /* Get base address */
72 if (IsProcMod)
73 {
74 Info->ImageBase = IntGetImageBase(System);
75 if (!Info->ImageBase)
76 {
77 printf("IntGetImageBase failed\n");
78 return FALSE;
79 }
80 }
81 else
82 {
83 /* FIXME */
84 printf("Not supported yet!\n");
85 return FALSE;
86 }
87
88 /* Skip disk */
89 strcpy(Info->Path, System + 2);
90 Info->Len = strlen(Info->Path);
91
92 return TRUE;
93 }
94
95 START_TEST(GetDeviceDriverFileName)
96 {
97 DWORD Len;
98 CHAR FileName[255];
99 TEST_MODULE_INFO ModInfo;
100
101 SetLastError(0xDEADBEEF);
102 Len = GetDeviceDriverFileNameA(0, FileName, 255);
103 ok(Len == 0, "Len: %lu\n", Len);
104 ok(GetLastError() == ERROR_INVALID_HANDLE, "Error: %lx\n", GetLastError());
105
106 if (IntGetModuleInformation("ntdll.dll", FALSE, TRUE, &ModInfo))
107 {
108 SetLastError(0xDEADBEEF);
109 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, 255);
110 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
111 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
112 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
113
114 /* Test with too small buffer */
115 SetLastError(0xDEADBEEF);
116 ModInfo.Len--;
117 ModInfo.Path[ModInfo.Len] = 0;
118 FileName[ModInfo.Len] = 0;
119 Len = GetDeviceDriverFileNameA(ModInfo.ImageBase, FileName, ModInfo.Len);
120 ok(Len == ModInfo.Len, "Len: %lu\n", Len);
121 ok(GetLastError() == 0xDEADBEEF, "Error: %lx\n", GetLastError());
122 ok(lstrcmpiA(ModInfo.Path, FileName) == 0, "File name: %s\n", FileName);
123 }
124 else
125 {
126 skip("Couldn't find info about ntdll.dll\n");
127 }
128 }