5 #define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800
10 HANDLE hCurrentProcess
;
13 #define MAX_SYMBOL_NAME 1024
15 BOOL
InitDbgHelp(HANDLE hProcess
)
17 if (!SymInitialize(hProcess
, 0, FALSE
))
20 SymSetOptions(SymGetOptions() | SYMOPT_ALLOW_ABSOLUTE_SYMBOLS
);
21 SymSetOptions(SymGetOptions() & (~SYMOPT_DEFERRED_LOADS
));
22 SymSetSearchPath(hProcess
, "srv**symbols*http://msdl.microsoft.com/download/symbols");
27 ImageSymToVa(HANDLE hProcess
, PSYMBOL_INFO pSym
, PBYTE pModule
, PCSTR Name
)
29 PIMAGE_NT_HEADERS NtHeaders
;
32 pSym
->SizeOfStruct
= sizeof(SYMBOL_INFO
);
33 pSym
->MaxNameLen
= MAX_SYMBOL_NAME
-1;
35 if (!SymFromName(hProcess
, Name
, pSym
))
37 printf("SymGetSymFromName64() failed: %ld\n", GetLastError());
40 #if defined(__GNUC__) && \
41 (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__ < 40400)
42 printf("looking up adress for %s: 0x%llx\n", Name
, pSym
->Address
);
44 printf("looking up adress for %s: 0x%I64x\n", Name
, pSym
->Address
);
47 NtHeaders
= ImageNtHeader(pModule
);
48 p
= ImageRvaToVa(NtHeaders
, pModule
, pSym
->Address
- pSym
->ModBase
, NULL
);
53 BOOL CALLBACK
EnumSymbolsProc(
54 PSYMBOL_INFO pSymInfo
,
58 if ((UINT
)UserContext
== -1)
60 printf("%s ", pSymInfo
->Name
);
66 printf("%s@%d ", pSymInfo
->Name
, (UINT
)UserContext
);
70 printf("%s <+ %d> ", pSymInfo
->Name
, (UINT
)UserContext
);
76 int main(int argc
, char* argv
[])
79 CHAR szModuleFileName
[MAX_PATH
+1];
81 HANDLE hFile
= 0, hMap
= 0;
84 PVOID pW32pServiceTable
, pW32pServiceLimit
;
85 PBYTE pW32pArgumentTable
;
92 CHAR Name
[MAX_SYMBOL_NAME
];
95 printf("Win32k Syscall dumper\n");
96 printf("Copyright (c) Timo Kreuzer 2007-08\n");
98 hProcess
= GetCurrentProcess();
101 GetCurrentDirectory(MAX_PATH
, szModuleFileName
);
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
)
111 GetSystemDirectory(szModuleFileName
, MAX_PATH
);
112 strcat(szModuleFileName
, "\\win32k.sys");
113 hFile
= CreateFile(szModuleFileName
, FILE_READ_DATA
, FILE_SHARE_READ
, NULL
,
114 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL
);
115 if (hFile
== INVALID_HANDLE_VALUE
)
117 printf("CreateFile() failed: %ld!\n", GetLastError());
122 printf("Trying to get syscalls from: %s\n", szModuleFileName
);
124 if (!InitDbgHelp(hProcess
))
126 printf("SymInitialize() failed\n");
130 printf("Loading symbols for %s, please wait...\n", szModuleFileName
);
131 dwModuleBase
= SymLoadModule64(hProcess
, 0, szModuleFileName
, 0, 0, 0);
132 if (dwModuleBase
== 0)
134 printf("SymLoadModule64() failed: %ld\n", GetLastError());
138 hMap
= CreateFileMappingA(hFile
, NULL
, PAGE_READONLY
, 0, 0, NULL
);
141 printf("CreateFileMapping() failed: %ld\n", GetLastError());
145 pModule
= MapViewOfFile(hMap
, FILE_MAP_READ
, 0, 0, 0);
148 printf("MapViewOfFile() failed: %ld\n", GetLastError());
152 bX64
= (ImageNtHeader(pModule
)->FileHeader
.Machine
!= IMAGE_FILE_MACHINE_I386
);
154 pW32pServiceTable
= ImageSymToVa(hProcess
, &Sym
.Symbol
, pModule
, "W32pServiceTable");
155 pW32pServiceLimit
= ImageSymToVa(hProcess
, &Sym
.Symbol
, pModule
, "W32pServiceLimit");
156 pW32pArgumentTable
= ImageSymToVa(hProcess
, &Sym
.Symbol
, pModule
, "W32pArgumentTable");
157 // printf("pW32pServiceTable = %p\n", pW32pServiceTable);
158 // printf("pW32pServiceLimit = %p\n", pW32pServiceLimit);
159 // printf("pW32pArgumentTable = %p\n", pW32pArgumentTable);
161 if (!pW32pServiceTable
|| !pW32pServiceLimit
|| !pW32pArgumentTable
)
163 printf("Couldn't find adress!\n");
167 dwServiceLimit
= *((DWORD
*)pW32pServiceLimit
);
171 DWORD
*pdwEntries32
= (DWORD
*)pW32pServiceTable
;
173 for (i
= 0; i
< dwServiceLimit
; i
++)
175 printf("0x%x:", i
+0x1000);
176 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pdwEntries32
[i
], EnumSymbolsProc
, (PVOID
)(DWORD
)pW32pArgumentTable
[i
]);
182 DWORD64
*pdwEntries64
= (DWORD64
*)pW32pServiceTable
;
184 for (i
= 0; i
< dwServiceLimit
; i
++)
186 printf("0x%x:", i
+0x1000);
187 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pdwEntries64
[i
], EnumSymbolsProc
, (PVOID
)(DWORD
)pW32pArgumentTable
[i
]);
192 /* Dump apfnSimpleCall */
193 printf("\nDumping apfnSimpleCall:\n");
194 pfnSimpleCall
= (PVOID
*)ImageSymToVa(hProcess
, &Sym
.Symbol
, pModule
, "apfnSimpleCall");
199 DWORD64
*pfnSC64
= (DWORD64
*)pfnSimpleCall
;
200 while (pfnSC64
[i
] != 0)
203 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pfnSC64
[i
], EnumSymbolsProc
, (PVOID
)-1);
210 DWORD
*pfnSC32
= (DWORD
*)pfnSimpleCall
;
211 while (pfnSC32
[i
] != 0)
214 SymEnumSymbolsForAddr(hProcess
, (DWORD64
)pfnSC32
[i
], EnumSymbolsProc
, (PVOID
)-1);
223 UnmapViewOfFile(pModule
);