|
|
1.1 root 1: /**********************************************************************\
2: * *
3: * Copyright (c) 1992, 1993 Microsoft Corporation *
4: * *
5: * Module Name: *
6: * *
7: * wdbgexts.c *
8: * *
9: * Abstract: *
10: * *
11: * This file is a ported version of ntsdexts.c, supporting remote *
12: * operations in WinDbg command window. *
13: * *
14: * By including wdbgexts.h, an extension has 4 more apis available, *
15: * beyond those available to ntsd extensions: *
16: * *
17: * PWINDBG_READ_PROCESS_MEMORY_ROUTINE lpReadProcessMemoryRoutine; *
18: * PWINDBG_WRITE_PROCESS_MEMORY_ROUTINE lpWriteProcessMemoryRoutine; *
19: * PWINDBG_GET_THREAD_CONTEXT_ROUTINE lpGetThreadContextRoutine; *
20: * PWINDBG_SET_THREAD_CONTEXT_ROUTINE lpSetThreadContextRoutine; *
21: * *
22: * The apis available to NTSD and WINDBG extensions are: *
23: * *
24: * PNTSD_OUTPUT_ROUTINE lpOutputRoutine; *
25: * PNTSD_GET_EXPRESSION lpGetExpressionRoutine; *
26: * PNTSD_GET_SYMBOL lpGetSymbolRoutine; *
27: * PNTSD_DISASM lpDisasmRoutine; *
28: * PNTSD_CHECK_CONTROL_C lpCheckControlCRoutine; *
29: * *
30: * Author: *
31: * *
32: * Peter Sun *
33: * *
34: \**********************************************************************/
35:
36: #include <windows.h>
37: #include <string.h>
38: #include <wdbgexts.h>
39:
40: #define MAXLEN 80
41:
42: CHAR igrepLastPattern[256];
43: DWORD igrepSearchStartAddress;
44: DWORD igrepLastPc;
45:
46:
47: /**********************************************************************\
48: * *
49: * igrep( ) *
50: * *
51: * Description: *
52: * *
53: * This function is called as a WINDBG extension to grep the *
54: * instruction stream for a particular pattern. *
55: * *
56: * Arguments: *
57: * *
58: * hCurrentProcess - Supplies a handle to the current process (at *
59: * the time the extension was called). *
60: * *
61: * hCurrentThread - Supplies a handle to the current thread (at *
62: * the time the extension was called). *
63: * *
64: * CurrentPc - Supplies the current pc at the time the extension is *
65: * called. *
66: * *
67: * lpExtensionApis - Supplies the address of the functions callable *
68: * by this extension. *
69: * *
70: * lpArgumentString Supplies the pattern and expression for this *
71: * command. *
72: * *
73: * Return Value: *
74: * *
75: * None. *
76: \**********************************************************************/
77:
78: VOID igrep (
79: HANDLE hCurrentProcess,
80: HANDLE hCurrentThread,
81: DWORD dwCurrentPc,
82: PWINDBG_EXTENSION_APIS lpExtensionApis,
83: LPSTR lpArgumentString
84: )
85:
86: {
87: DWORD dwNextGrepAddr;
88: DWORD dwCurrGrepAddr;
89: CHAR SourceLine[256];
90: BOOL NewPc;
91: DWORD d;
92: PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
93: PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
94: PNTSD_GET_SYMBOL lpGetSymbolRoutine;
95: PNTSD_DISASM lpDisasmRoutine;
96: PNTSD_CHECK_CONTROL_C lpCheckControlCRoutine;
97: LPSTR pc;
98: LPSTR Pattern;
99: LPSTR Expression;
100: CHAR Symbol[64];
101: DWORD Displacement;
102:
103: UNREFERENCED_PARAMETER( hCurrentProcess );
104: UNREFERENCED_PARAMETER( hCurrentThread );
105:
106: lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
107: lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
108: lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
109: lpDisasmRoutine = lpExtensionApis->lpDisasmRoutine;
110: lpCheckControlCRoutine = lpExtensionApis->lpCheckControlCRoutine;
111:
112: if( igrepLastPc && igrepLastPc == dwCurrentPc ) {
113: NewPc = FALSE;
114: }
115: else {
116: igrepLastPc = dwCurrentPc;
117: NewPc = TRUE;
118: }
119:
120: //
121: // check for pattern.
122: //
123:
124: pc = lpArgumentString;
125: Pattern = NULL;
126: Expression = NULL;
127: if( *pc ) {
128: Pattern = pc;
129: while( *pc > ' ' ) {
130: pc++;
131: }
132:
133: //
134: // check for an expression
135: //
136:
137: if( *pc != '\0' ) {
138: *pc = '\0';
139: pc++;
140: if( *pc <= ' ' ) {
141: while (*pc <= ' ') {
142: pc++;
143: }
144: }
145: if( *pc ) {
146: Expression = pc;
147: }
148: }
149: }
150:
151: if( Pattern ) {
152: strcpy(igrepLastPattern,Pattern);
153:
154: if( Expression ) {
155: igrepSearchStartAddress = (lpGetExpressionRoutine)(Expression);
156: if( !igrepSearchStartAddress ) {
157: igrepSearchStartAddress = igrepLastPc;
158: return;
159: }
160: }
161: else {
162: igrepSearchStartAddress = igrepLastPc;
163: }
164: }
165:
166: dwNextGrepAddr = igrepSearchStartAddress;
167: dwCurrGrepAddr = dwNextGrepAddr;
168: d = (lpDisasmRoutine)(&dwNextGrepAddr,SourceLine,FALSE);
169: while( d ) {
170: if( strstr(SourceLine,igrepLastPattern) ) {
171: igrepSearchStartAddress = dwNextGrepAddr;
172: (lpGetSymbolRoutine)((LPVOID)dwCurrGrepAddr,(PUCHAR)Symbol,&Displacement);
173: (lpOutputRoutine)("%s",SourceLine);
174: return;
175: }
176: if( (lpCheckControlCRoutine)() ) {
177: return;
178: }
179: dwCurrGrepAddr = dwNextGrepAddr;
180: d = (lpDisasmRoutine)(&dwNextGrepAddr,SourceLine,FALSE);
181: }
182: }
183:
184:
185: /**********************************************************************\
186: * *
187: * str( ) *
188: * *
189: * Routine Description: *
190: * *
191: * This function is called as a WINDBG extension to format and dump *
192: * a counted ansi string. *
193: * *
194: * Arguments: *
195: * *
196: * hCurrentProcess - Supplies a handle to the current process (at *
197: * the time the extension was called). *
198: * *
199: * hCurrentThread - Supplies a handle to the current thread (at the *
200: * time the extension was called). *
201: * *
202: * CurrentPc - Supplies the current pc at the time the extension is *
203: * called. *
204: * *
205: * lpExtensionApis - Supplies the address of the functions callable *
206: * by this extension. *
207: * *
208: * lpArgumentString - Supplies the asciiz string that describes the *
209: * ansi string to be dumped. *
210: * *
211: * Return Value: *
212: * *
213: * None. *
214: * *
215: \**********************************************************************/
216:
217: VOID str (
218: HANDLE hCurrentProcess,
219: HANDLE hCurrentThread,
220: DWORD dwCurrentPc,
221: PWINDBG_EXTENSION_APIS lpExtensionApis,
222: LPSTR lpArgumentString
223: )
224:
225: {
226: CHAR String[MAXLEN];
227: size_t Length;
228: DWORD dwAddrString;
229: CHAR Symbol[64];
230: LPSTR StringData;
231: DWORD Displacement;
232: BOOL b;
233: PNTSD_OUTPUT_ROUTINE lpOutputRoutine;
234: PNTSD_GET_EXPRESSION lpGetExpressionRoutine;
235: PNTSD_GET_SYMBOL lpGetSymbolRoutine;
236:
237: UNREFERENCED_PARAMETER( hCurrentProcess );
238: UNREFERENCED_PARAMETER( hCurrentThread );
239: UNREFERENCED_PARAMETER( dwCurrentPc );
240:
241: lpOutputRoutine = lpExtensionApis->lpOutputRoutine;
242: lpGetExpressionRoutine = lpExtensionApis->lpGetExpressionRoutine;
243: lpGetSymbolRoutine = lpExtensionApis->lpGetSymbolRoutine;
244:
245: //
246: // Evaluate the argument string to get the address of
247: // the string to dump.
248: //
249:
250: dwAddrString = (lpGetExpressionRoutine)(lpArgumentString);
251: if (!dwAddrString) {
252: (lpOutputRoutine)( "Invalid Expression." );
253: return;
254: }
255:
256: //
257: // Get the symbolic name of the string
258: //
259:
260: (lpGetSymbolRoutine)((LPVOID)dwAddrString,(PUCHAR)Symbol,&Displacement);
261:
262: //
263: // Read current process memory and handle remote read as well
264: //
265:
266: b = (lpExtensionApis->lpReadProcessMemoryRoutine)(
267: dwAddrString,
268: String,
269: MAXLEN,
270: NULL
271: );
272:
273: if (!b) {
274: (lpOutputRoutine)( "ReadProcessMemory failed." );
275: return;
276: }
277:
278: Length = strlen( String );
279:
280: StringData = (LPSTR)LocalAlloc(LMEM_ZEROINIT,Length+1);
281:
282: if (!StringData) {
283: (lpOutputRoutine)( "LocalAlloc failed. Error = %x", GetLastError());
284: return;
285: }
286:
287: (lpOutputRoutine)(
288: "String: %s ; %d bytes at %lx\n",
289: String,
290: Length,
291: dwAddrString
292: );
293:
294: LocalFree( StringData );
295: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.