9 HANDLE hCurrentProcess
;
11 #define MAX_SYMBOL_NAME 1024
13 BOOL
InitDbgHelp(HANDLE hProcess
)
15 if (!SymInitialize(hProcess
, 0, FALSE
))
18 SymSetOptions(SymGetOptions() | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS
);
19 SymSetOptions(SymGetOptions() & (~SYMOPT_DEFERRED_LOADS
));
20 SymSetSearchPath(hProcess
, "srv**symbols*http://msdl.microsoft.com/download/symbols");
25 GetOffsetFromName(HANDLE hProcess
, PSYMBOL_INFO pSym
, PBYTE pModule
, PCSTR Name
, PBOOL pbX64
)
27 PIMAGE_NT_HEADERS NtHeaders
;
30 pSym
->SizeOfStruct
= sizeof(SYMBOL_INFO
);
31 pSym
->MaxNameLen
= MAX_SYMBOL_NAME
-1;
33 if (!SymFromName(hProcess
, Name
, pSym
))
35 printf("SymGetSymFromName64() failed: %ld\n", GetLastError());
38 printf("looking up adress for %s: 0x%llx\n", Name
, pSym
->Address
);
40 NtHeaders
= ImageNtHeader(pModule
);
41 *pbX64
= (NtHeaders
->FileHeader
.Machine
!= IMAGE_FILE_MACHINE_I386
);
43 p
= ImageRvaToVa(NtHeaders
, pModule
, pSym
->Address
- pSym
->ModBase
, NULL
);
45 return (DWORD64
)((ULONG_PTR
)p
- (ULONG_PTR
)pModule
);
48 BOOL CALLBACK
EnumSymbolsProc(
49 PSYMBOL_INFO pSymInfo
,
53 if ((UINT
)UserContext
== -1)
55 printf("%s ", pSymInfo
->Name
);
59 printf("%s@%d ", pSymInfo
->Name
, (UINT
)UserContext
);
64 int main(int argc
, char* argv
[])
67 CHAR szModuleFileName
[MAX_PATH
+1];
69 HANDLE hFile
= 0, hMap
= 0;
73 DWORD64 dwW32pServiceTable
, dwW32pServiceLimit
, dwW32pArgumentTable
;
82 CHAR Name
[MAX_SYMBOL_NAME
];
85 printf("Win32k Syscall dumper\n");
86 printf("Copyright (c) Timo Kreuzer 2007\n");
88 hProcess
= GetCurrentProcess();
91 GetCurrentDirectory(MAX_PATH
, szModuleFileName
);
92 strcat(szModuleFileName
, "\\win32k.sys");
93 hFile
= CreateFile(szModuleFileName
, FILE_READ_DATA
, FILE_SHARE_READ
, NULL
,
94 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
95 if (hFile
!= INVALID_HANDLE_VALUE
)
101 GetSystemDirectory(szModuleFileName
, MAX_PATH
);
102 strcat(szModuleFileName
, "\\win32k.sys");
103 hFile
= CreateFile(szModuleFileName
, FILE_READ_DATA
, FILE_SHARE_READ
, NULL
,
104 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
105 if (hFile
== INVALID_HANDLE_VALUE
)
107 printf("CreateFile() failed: %ld!\n", GetLastError());
112 printf("Trying to get syscalls from: %s\n", szModuleFileName
);
114 if (!InitDbgHelp(hProcess
))
116 printf("SymInitialize() failed\n");
120 printf("Loading symbols for %s, please wait...\n", szModuleFileName
);
121 dwModuleBase
= SymLoadModule64(hProcess
, 0, szModuleFileName
, 0, 0, 0);
122 if (dwModuleBase
== 0)
124 printf("SymLoadModule64() failed: %ld\n", GetLastError());
128 hMap
= CreateFileMappingA(hFile
, NULL
, PAGE_READONLY
, 0, 0, NULL
);
131 printf("CreateFileMapping() failed: %ld\n", GetLastError());
135 pModule
= MapViewOfFile(hMap
, FILE_MAP_READ
, 0, 0, 0);
138 printf("MapViewOfFile() failed: %ld\n", GetLastError());
142 dwW32pServiceTable
= GetOffsetFromName(hProcess
, &Sym
.Symbol
, pModule
, "W32pServiceTable", &bX64
);
143 dwW32pServiceLimit
= GetOffsetFromName(hProcess
, &Sym
.Symbol
, pModule
, "W32pServiceLimit", &bX64
);
144 dwW32pArgumentTable
= GetOffsetFromName(hProcess
, &Sym
.Symbol
, pModule
, "W32pArgumentTable", &bX64
);
145 printf("dwW32pServiceTable = %llx\n", dwW32pServiceTable
);
146 printf("dwW32pServiceLimit = %llx\n", dwW32pServiceLimit
);
147 printf("dwW32pArgumentTable = %llx\n", dwW32pArgumentTable
);
149 if (!dwW32pServiceTable
|| !dwW32pServiceLimit
|| !dwW32pArgumentTable
)
151 printf("Couldn't find adress!\n");
155 dwServiceLimit
= *((DWORD
*)(pModule
+ dwW32pServiceLimit
));
156 pdwArgs
= (BYTE
*)(pModule
+ dwW32pArgumentTable
);
160 DWORD
*pdwEntries32
= (DWORD
*)(pModule
+ dwW32pServiceTable
);
162 for (i
= 0; i
< dwServiceLimit
; i
++)
164 printf("0x%x:", i
+0x1000);
165 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pdwEntries32
[i
], EnumSymbolsProc
, (PVOID
)(DWORD
)pdwArgs
[i
]);
171 DWORD64
*pdwEntries64
= (DWORD64
*)(pModule
+ dwW32pServiceTable
);
173 for (i
= 0; i
< dwServiceLimit
; i
++)
175 printf("0x%x:", i
+0x1000);
176 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pdwEntries64
[i
], EnumSymbolsProc
, (PVOID
)(i
+0x1000));
181 /* Dump apfnSimpleCall */
182 printf("\nDumping apfnSimpleCall:\n");
183 dwSimpleCall
= GetOffsetFromName(hProcess
, &Sym
.Symbol
, pModule
, "apfnSimpleCall", &bX64
);
184 pfnSimpleCall
= (PVOID
*)(pModule
+ dwSimpleCall
);
186 while (pfnSimpleCall
[i
] != NULL
)
189 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)(ULONG_PTR
)pfnSimpleCall
[i
], EnumSymbolsProc
, (PVOID
)-1);
198 UnmapViewOfFile(pModule
);