/*++ Copyright (c) 1992 Microsoft Corporation Module Name: ntsdextp.h Abstract: Common header file for NTSDEXTS component source files. Author: Steve Wood (stevewo) 21-Feb-1995 Revision History: --*/ #include #include #include #include #include #define NOEXTAPI #include #undef DECLARE_API #include #include #include #include #include #include #include "oc.h" #include "ocmdeb.h" //#include #define move(dst, src)\ try {\ ReadMemory((DWORD_PTR) (src), &(dst), sizeof(dst), NULL);\ } except (EXCEPTION_EXECUTE_HANDLER) {\ return;\ } #define moveBlock(dst, src, size)\ try {\ ReadMemory((DWORD_PTR) (src), &(dst), (size), NULL);\ } except (EXCEPTION_EXECUTE_HANDLER) {\ return;\ } #ifdef __cplusplus #define CPPMOD extern "C" #else #define CPPMOD #endif #define DECLARE_API(s) \ CPPMOD VOID \ s( \ HANDLE hCurrentProcess, \ HANDLE hCurrentThread, \ DWORD dwCurrentPc, \ PWINDBG_EXTENSION_APIS lpExtensionApis, \ LPSTR lpArgumentString \ ) #define INIT_API() { \ ExtensionApis = *lpExtensionApis; \ ExtensionCurrentProcess = hCurrentProcess; \ } #define dprintf (ExtensionApis.lpOutputRoutine) #define GetExpression (ExtensionApis.lpGetExpressionRoutine) #define GetSymbol (ExtensionApis.lpGetSymbolRoutine) #define Disassm (ExtensionApis.lpDisasmRoutine) #define CheckControlC (ExtensionApis.lpCheckControlCRoutine) //#define ReadMemory(a,b,c,d) ReadProcessMemory( ExtensionCurrentProcess, (LPCVOID)(a), (b), (c), (d) ) #define ReadMemory(a,b,c,d) \ ((ExtensionApis.nSize == sizeof(WINDBG_OLD_EXTENSION_APIS)) ? \ ReadProcessMemory( ExtensionCurrentProcess, (LPCVOID)(a), (b), (c), (d) ) \ : ExtensionApis.lpReadProcessMemoryRoutine( (DWORD_PTR)(a), (b), (c), (d) )) //#define WriteMemory(a,b,c,d) WriteProcessMemory( ExtensionCurrentProcess, (LPVOID)(a), (LPVOID)(b), (c), (d) ) #define WriteMemory(a,b,c,d) \ ((ExtensionApis.nSize == sizeof(WINDBG_OLD_EXTENSION_APIS)) ? \ WriteProcessMemory( ExtensionCurrentProcess, (LPVOID)(a), (LPVOID)(b), (c), (d) ) \ : ExtensionApis.lpWriteProcessMemoryRoutine( (DWORD_PTR)(a), (LPVOID)(b), (c), (d) )) #ifndef malloc #define malloc( n ) HeapAlloc( GetProcessHeap(), 0, (n) ) #endif #ifndef free #define free( p ) HeapFree( GetProcessHeap(), 0, (p) ) #endif extern WINDBG_EXTENSION_APIS ExtensionApis; extern HANDLE ExtensionCurrentProcess; // // debuggee typedefs // #define HASH_BUCKET_COUNT 509 typedef struct _MY_LOCK { HANDLE handles[2]; } MYLOCK, *PMYLOCK; typedef struct _STRING_TABLE { PUCHAR Data; // First HASH_BUCKET_COUNT DWORDS are StringNodeOffset array. DWORD DataSize; DWORD BufferSize; MYLOCK Lock; UINT ExtraDataSize; } STRING_TABLE, *PSTRING_TABLE; typedef struct _STRING_NODEA { // // This is stored as an offset instead of a pointer // because the table can move as it's built // The offset is from the beginning of the table // ULONG_PTR NextOffset; // // This field must be last // CHAR String[ANYSIZE_ARRAY]; } STRING_NODEA, *PSTRING_NODEA; typedef struct _STRING_NODEW { // // This is stored as an offset instead of a pointer // because the table can move as it's built // The offset is from the beginning of the table // ULONG_PTR NextOffset; // // This field must be last // WCHAR String[ANYSIZE_ARRAY]; } STRING_NODEW, *PSTRING_NODEW; typedef struct _DISK_SPACE_LIST { MYLOCK Lock; PVOID DrivesTable; UINT Flags; } DISK_SPACE_LIST, *PDISK_SPACE_LIST; // // These structures are stored as data associated with // paths/filenames in the string table. // typedef struct _XFILE { // // -1 means it doesn't currently exist // LONGLONG CurrentSize; // // -1 means it will be deleted. // LONGLONG NewSize; } XFILE, *PXFILE; typedef struct _XDIRECTORY { // // Value indicating how many bytes will be required // to hold all the files in the FilesTable after they // are put on a file queue and then the queue is committed. // // This may be a negative number indicating that space will // actually be freed! // LONGLONG SpaceRequired; PVOID FilesTable; } XDIRECTORY, *PXDIRECTORY; typedef struct _XDRIVE { // // Value indicating how many bytes will be required // to hold all the files in the space list for this drive. // // This may be a negative number indicating that space will // actually be freed! // LONGLONG SpaceRequired; PVOID DirsTable; DWORD BytesPerCluster; // // This is the amount to skew SpaceRequired, based on // SetupAdjustDiskSpaceList(). We track this separately // for flexibility. // LONGLONG Slop; } XDRIVE, *PXDRIVE; typedef struct _QUEUECONTEXT { HWND OwnerWindow; DWORD MainThreadId; HWND ProgressDialog; HWND ProgressBar; BOOL Cancelled; PTSTR CurrentSourceName; BOOL ScreenReader; BOOL MessageBoxUp; WPARAM PendingUiType; PVOID PendingUiParameters; UINT CancelReturnCode; BOOL DialogKilled; // // If the SetupInitDefaultQueueCallbackEx is used, the caller can // specify an alternate handler for progress. This is useful to // get the default behavior for disk prompting, error handling, etc, // but to provide a gas gauge embedded, say, in a wizard page. // // The alternate window is sent ProgressMsg once when the copy queue // is started (wParam = 0. lParam = number of files to copy). // It is then also sent once per file copied (wParam = 1. lParam = 0). // // NOTE: a silent installation (i.e., no progress UI) can be accomplished // by specifying an AlternateProgressWindow handle of INVALID_HANDLE_VALUE. // HWND AlternateProgressWindow; UINT ProgressMsg; UINT NoToAllMask; HANDLE UiThreadHandle; #ifdef NOCANCEL_SUPPORT BOOL AllowCancel; #endif } QUEUECONTEXT, *PQUEUECONTEXT; // // Make absolutely sure that these structures are DWORD aligned // because we turn alignment off, to make sure sdtructures are // packed as tightly as possible into memory blocks. // // // Internal representation of a section in an inf file // typedef struct _INF_LINE { // // Number of values on the line // This includes the key if Flags has INF_LINE_HASKEY // (In that case the first two entries in the Values array // contain the key--the first one in case-insensitive form used // for lookup, and the second in case-sensitive form for display. // INF lines with a single value (no key) are treated the same way.) // Otherwise the first entry in the Values array is the first // value on the line // WORD ValueCount; WORD Flags; // // String IDs for the values on the line. // The values are stored in the value block, // one after another. // // The value is the offset within the value block as opposed to // an actual pointer. We do this because the value block gets // reallocated as the inf file is loaded. // UINT Values; } INF_LINE, *PINF_LINE; // // INF_LINE.Flags // #define INF_LINE_HASKEY 0x0000001 #define INF_LINE_SEARCHABLE 0x0000002 #define HASKEY(Line) ((Line)->Flags & INF_LINE_HASKEY) #define ISSEARCHABLE(Line) ((Line)->Flags & INF_LINE_SEARCHABLE) // // INF section // This guy is kept separate and has a pointer to the actual data // to make sorting the sections a little easier // typedef struct _INF_SECTION { // // String Table ID of the name of the section // LONG SectionName; // // Number of lines in this section // DWORD LineCount; // // The section's lines. The line structures are stored packed // in the line block, one after another. // // The value is the offset within the line block as opposed to // an actual pointer. We do it this way because the line block // gets reallocated as the inf file is loaded. // UINT Lines; } INF_SECTION, *PINF_SECTION; // // Params for section enumeration // typedef struct { PTSTR Buffer; UINT Size; UINT SizeNeeded; PTSTR End; } SECTION_ENUM_PARAMS, *PSECTION_ENUM_PARAMS; // // Define structures for user-defined DIRID storage. // typedef struct _USERDIRID { UINT Id; TCHAR Directory[MAX_PATH]; } USERDIRID, *PUSERDIRID; typedef struct _USERDIRID_LIST { PUSERDIRID UserDirIds; // may be NULL UINT UserDirIdCount; } USERDIRID_LIST, *PUSERDIRID_LIST; typedef struct _STRINGSUBST_NODE { UINT ValueOffset; LONG TemplateStringId; BOOL CaseSensitive; } STRINGSUBST_NODE, *PSTRINGSUBST_NODE; // // Version block structure that is stored (packed) in the opaque // VersionData buffer of a caller-supplied SP_INF_INFORMATION structure. // typedef struct _INF_VERSION_BLOCK { UINT NextOffset; FILETIME LastWriteTime; WORD DatumCount; WORD OffsetToData; // offset (in bytes) from beginning of Filename buffer. UINT DataSize; // DataSize and TotalSize are both byte counts. UINT TotalSize; TCHAR Filename[ANYSIZE_ARRAY]; // // Data follows Filename in the buffer // } INF_VERSION_BLOCK, *PINF_VERSION_BLOCK; // // Internal version block node. // typedef struct _INF_VERSION_NODE { FILETIME LastWriteTime; UINT FilenameSize; CONST TCHAR *DataBlock; UINT DataSize; WORD DatumCount; TCHAR Filename[MAX_PATH]; } INF_VERSION_NODE, *PINF_VERSION_NODE; // // Internal representation of an inf file. // typedef struct _LOADED_INF { DWORD Signature; // // The following 3 fields are used for precompiled INFs (PNF). // If FileHandle is not INVALID_HANDLE_VALUE, then this is a PNF, // and the MappingHandle and ViewAddress fields are also valid. // Otherwise, this is a plain old in-memory INF. // HANDLE FileHandle; HANDLE MappingHandle; PVOID ViewAddress; PVOID StringTable; DWORD SectionCount; PINF_SECTION SectionBlock; PINF_LINE LineBlock; PLONG ValueBlock; INF_VERSION_NODE VersionBlock; BOOL HasStrings; // // If this INF contains any DIRID references to the system partition, then // store the OsLoader path that was used when compiling this INF here. (This // value will always be correct when the INF is loaded. However, if drive letters // are subsequently reassigned, then it will be incorrect until the INF is unloaded // and re-loaded.) // PCTSTR OsLoaderPath; // may be NULL // // Remember the location where this INF originally came from (may be a directory // path or a URL). // DWORD InfSourceMediaType; // SPOST_PATH or SPOST_URL PCTSTR InfSourcePath; // may be NULL // // Remember the INF's original filename, before it was installed into // %windir%\Inf (i.e., automatically via device installation or explicitly // via SetupCopyOEMInf). // PCTSTR OriginalInfName; // may be NULL // // Maintain a list of value offsets that require string substitution at // run-time. // PSTRINGSUBST_NODE SubstValueList; // may be NULL WORD SubstValueCount; // // Place the style WORD here (immediately following another WORD field), // to fill a single DWORD. // WORD Style; // INF_STYLE_OLDNT, INF_STYLE_WIN4 // // Sizes in bytes of various buffers // UINT SectionBlockSizeBytes; UINT LineBlockSizeBytes; UINT ValueBlockSizeBytes; // // Track what language was used when loading this INF. // DWORD LanguageId; // // Embedded structure containing information about the current user-defined // DIRID values. // USERDIRID_LIST UserDirIdList; // // Synchronization. // MYLOCK Lock; // // INFs are append-loaded via a doubly-linked list of LOADED_INFs. // (list is not circular--Prev of head is NULL, Next of tail is NULL) // struct _LOADED_INF *Prev; struct _LOADED_INF *Next; } LOADED_INF, *PLOADED_INF; #define LOADED_INF_SIG 0x24666e49 // Inf$ #define DRIVERSIGN_NONE 0x00000000 #define DRIVERSIGN_WARNING 0x00000001 #define DRIVERSIGN_BLOCKING 0x00000002 // // debugee prototypes // BOOL CheckInterupted( VOID ); VOID DumpStringTableHeader( PSTRING_TABLE pst ) ; PVOID GetStringTableData( PSTRING_TABLE st ); PVOID GetStringNodeExtraData( PSTRING_NODEW node ); PSTRING_NODEW GetNextNode( PVOID stdata, PSTRING_NODEW node, PULONG_PTR offset ); PSTRING_NODEW GetFirstNode( PVOID stdata, ULONG_PTR offset, PULONG_PTR poffset );