Windows2003-3790/base/ntsetup/setexts/setupapi.c
2020-09-30 16:53:55 +02:00

1183 lines
32 KiB
C

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
setupapi.c
Abstract:
This function contains the setupapi debugger extensions
Author:
Mark Lucovsky (markl) 09-Apr-1991
Revision History:
--*/
#include "ntsdextp.h"
#include <setupapi.h>
extern WINDBG_EXTENSION_APIS ExtensionApis;
extern HANDLE ExtensionCurrentProcess;
VOID
DumpXFile(
PXFILE pxf,
DWORD mask
)
{
PVOID pst;
DWORD i, offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
if ((mask & 4) == 0 ) {
return;
}
dprintf( "\t\t ***XFILE structure***\n" );
dprintf( "\t\t CurrentSize : 0x%x", pxf->CurrentSize );
if (pxf->CurrentSize == -1) {
dprintf( " (doesn't currently exist)" );
}
dprintf( "\n\t\t NewSize : 0x%x", pxf->NewSize );
if (pxf->NewSize == -1) {
dprintf( " (will be deleted)" );
}
dprintf("\n");
}
VOID
DumpXDirectory(
PXDIRECTORY pxd,
DWORD mask
)
{
PVOID pst;
DWORD i;
DWORD_PTR offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
PXFILE pxf;
if ((mask & 2) == 0 ) {
return;
}
dprintf( "\t\t ***XDIRECTORY structure***\n", pxd );
dprintf( "\t\t SpaceRequired : 0x%x\n", pxd->SpaceRequired );
dprintf( "\t\t FilesTable : 08%08x\n", pxd->FilesTable );
move ( st, pxd->FilesTable ) ;
dprintf("\t\t ***FilesTable***\n");
dprintf("\t\t Base Data ptr:\t0x%08x\n", st.Data);
dprintf("\t\t DataSize:\t0x%08x\n", st.DataSize);
dprintf("\t\t BufferSize:\t0x%08x\n", st.BufferSize);
dprintf("\t\t ExtraDataSize:\t0x%08x\n", st.ExtraDataSize);
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\t Data at hash bucket %d\n", i);
while (node) {
dprintf("\t\t Entry Name:\t%ws (0x%08x)\n", node->String, offset);
pxf = (PXFILE) GetStringNodeExtraData( node );
DumpXFile( pxf, mask );
free(pxf);
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
}
VOID
DumpXDrive(
PXDRIVE pxd,
DWORD mask
)
{
PVOID pst;
DWORD i;
DWORD_PTR offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
PXDIRECTORY pxdir;
if ((mask & 1) == 0) {
return;
}
dprintf( "\t\t***XDRIVE structure***\n", pxd );
dprintf( "\t\t SpaceRequired : 0x%x\n", pxd->SpaceRequired );
dprintf( "\t\t BytesPerCluster : 08%08x\n", pxd->BytesPerCluster );
dprintf( "\t\t Slop : 08%x\n", pxd->Slop );
dprintf( "\t\t DirsTable : 08%08x\n", pxd->DirsTable );
move ( st, pxd->DirsTable ) ;
dprintf("\t\t ***DirsTable***\n");
dprintf("\t\t Base Data ptr:\t0x%08x\n", st.Data);
dprintf("\t\t DataSize:\t0x%08x\n", st.DataSize);
dprintf("\t\t BufferSize:\t0x%08x\n", st.BufferSize);
dprintf("\t\t ExtraDataSize:\t0x%08x\n", st.ExtraDataSize);
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\t Data at hash bucket %d\n", i);
while (node) {
dprintf("\t\t Entry Name:\t%ws (0x%08x)\n", node->String, offset);
pxdir = (PXDIRECTORY) GetStringNodeExtraData( node );
DumpXDirectory( pxdir, mask );
free(pxdir);
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
}
DECLARE_API( space )
/*++
Routine Description:
This debugger extension dumps the data related to a HDSKSPC structure
Arguments:
Return Value:
--*/
{
DWORD ReturnLength;
PVOID pds,pst;
DISK_SPACE_LIST dsl;
DWORD i;
DWORD_PTR offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
PXDRIVE pxd;
DWORD Mask = 0;
//BOOL val;
INIT_API();
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
pds = (PVOID)GetExpression( lpArgumentString );
while (*lpArgumentString && (*lpArgumentString != ' ') ) {
lpArgumentString++;
}
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
if (*lpArgumentString) {
Mask = (DWORD)GetExpression( lpArgumentString );
}
move( dsl , pds );
dprintf("DISK_SPACE_LIST at :\t0x%08x\n", (ULONG_PTR) pds);
dprintf("\tLock[0] : 0x%08x\n", dsl.Lock.handles[0]);
dprintf("\tLock[1] : 0x%08x\n", dsl.Lock.handles[1]);
dprintf("\tDrivesTable : 0x%08x\n", dsl.DrivesTable );
dprintf("\tFlags : 0x%08x\n", dsl.Flags);
move ( st, dsl.DrivesTable ) ;
dprintf("\t ***DrivesTable***\n");
DumpStringTableHeader( &st );
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\tData at hash bucket %d\n", i);
while (node) {
dprintf("\t\tEntry Name:\t%ws (0x%08x)\n", node->String, offset);
pxd = (PXDRIVE) GetStringNodeExtraData( node );
DumpXDrive( pxd, Mask );
free(pxd);
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
}
#define TRACK_ARG_DECLARE
#define TRACK_ARG_COMMA
#include "cntxtlog.h"
#include "backup.h"
#include "fileq.h"
VOID DumpAltPlatformInfo( PSP_ALTPLATFORM_INFO api, DWORD mask );
VOID DumpFileQueueNodeList( PSP_FILE_QUEUE_NODE pfqn, DWORD mask, BOOL recursive ) ;
VOID DumpSourceMediaInfoList( PSOURCE_MEDIA_INFO smi, DWORD mask, BOOL recursive );
VOID DumpCatalogInfoList( PSPQ_CATALOG_INFO ci, DWORD mask, BOOL recursive );
VOID DumpUnwindList( PSP_UNWIND_NODE pun, DWORD mask, BOOL recursive );
VOID DumpDelayMoveList( PSP_DELAYMOVE_NODE pdn, DWORD mask, BOOL recursive );
VOID
DumpAltPlatformInfo(
PSP_ALTPLATFORM_INFO api,
DWORD mask
)
{
//if ((mask & 4) == 0 ) {
// return;
//}
dprintf( "\t\t***SP_ALT_PLATFORM_INFO structure***\n" );
dprintf( "\t\t cbSize : 0x%x\n", api->cbSize );
dprintf( "\t\t Platform : 0x%x\n", api->Platform );
dprintf( "\t\t MajorVersion : 0x%x\n", api->MajorVersion );
dprintf( "\t\t MinorVersion : 0x%x\n", api->MinorVersion );
dprintf( "\t\t ProcessorArchitecture : 0x%x\n", api->ProcessorArchitecture );
dprintf( "\t\t Reserved : 0x%x\n", api->Reserved );
}
VOID
DumpFileQueueNodeList(
PSP_FILE_QUEUE_NODE pfqn,
DWORD mask,
BOOL recursive
)
{
//PVOID pst;
//DWORD i, offset;
//PVOID stdata,pextradata;
//STRING_TABLE st;
//PSTRING_NODEW node;//, prev;
//if ((mask & 4) == 0 ) {
// return;
//}
SP_FILE_QUEUE_NODE next;
SOURCE_MEDIA_INFO smi;
SPQ_CATALOG_INFO ci;
dprintf( "\t\t***SP_FILE_QUEUE_NODE structure***\n" );
dprintf( "\t\t Next : 0x%x\n", pfqn->Next );
dprintf( "\t\t Operation : 0x%x ( %s )\n", pfqn->Operation,
(pfqn->Operation == FILEOP_DELETE) ? "DELETE" :
(pfqn->Operation == FILEOP_RENAME) ? "RENAME" :
"COPY" );
dprintf( "\t\t SourceRootPath : 0x%x\n", pfqn->SourceRootPath );
dprintf( "\t\t SourcePath : 0x%x\n", pfqn->SourcePath );
dprintf( "\t\t SourceFilename : 0x%x\n", pfqn->SourceFilename );
dprintf( "\t\t TargetDirectory : 0x%x\n", pfqn->TargetDirectory );
dprintf( "\t\t SecurityDesc : 0x%x\n", pfqn->SecurityDesc );
dprintf( "\t\t SourceMediaInfo : 0x%x\n", pfqn->SourceMediaInfo );
if (pfqn->SourceMediaInfo && recursive) {
if (CheckInterupted()) {
return;
}
move( smi, pfqn->SourceMediaInfo );
DumpSourceMediaInfoList( &smi, mask, FALSE );
}
dprintf( "\t\t StyleFlags : 0x%x\n", pfqn->StyleFlags );
dprintf( "\t\t InternalFlags : 0x%x\n", pfqn->InternalFlags );
dprintf( "\t\t CatalogInfo : 0x%x\n", pfqn->CatalogInfo );
if (pfqn->CatalogInfo && recursive) {
if (CheckInterupted()) {
return;
}
move( ci, pfqn->CatalogInfo);
DumpCatalogInfoList( &ci, mask, FALSE );
}
if (pfqn->Next && recursive) {
move( next, pfqn->Next );
DumpFileQueueNodeList( &next, mask, TRUE );
}
}
VOID
DumpSourceMediaInfoList(
PSOURCE_MEDIA_INFO smi,
DWORD mask,
BOOL recursive
)
{
//PVOID pst;
//DWORD i, offset;
//PVOID stdata,pextradata;
//STRING_TABLE st;
//PSTRING_NODEW node;//, prev;
//if ((mask & 4) == 0 ) {
// return;
//}
SOURCE_MEDIA_INFO next;
SP_FILE_QUEUE_NODE queue;
dprintf( "\t\t***SOURCE_MEDIA_INFO structure***\n" );
dprintf( "\t\t Next : 0x%x\n", smi->Next );
dprintf( "\t\t Description : 0x%x\n", smi->Description );
dprintf( "\t\t DescriptionDisplayName : 0x%x\n", smi->DescriptionDisplayName );
dprintf( "\t\t Tagfile : 0x%x\n", smi->Tagfile );
dprintf( "\t\t SourceRootPath : 0x%x\n", smi->SourceRootPath );
dprintf( "\t\t CopyQueue : 0x%x\n", smi->CopyQueue );
if (smi->CopyQueue && (mask & 8) && recursive) {
if (CheckInterupted()) {
return;
}
move ( queue, smi->CopyQueue ) ;
DumpFileQueueNodeList( &queue, mask, FALSE );
}
dprintf( "\t\t CopyNodeCount : 0x%x\n", smi->CopyNodeCount );
dprintf( "\t\t Flags : 0x%x\n", smi->Flags );
if (smi->Next && recursive) {
if (CheckInterupted()) {
return;
}
move ( next, smi->Next ) ;
DumpSourceMediaInfoList( &next, mask, TRUE );
}
}
VOID
DumpCatalogInfoList(
PSPQ_CATALOG_INFO ci,
DWORD mask,
BOOL recursive
)
{
//PVOID pst;
//DWORD i, offset;
//PVOID stdata,pextradata;
//STRING_TABLE st;
//PSTRING_NODEW node;//, prev;
//if ((mask & 4) == 0 ) {
// return;
//}
SPQ_CATALOG_INFO next;
dprintf( "\t\t***SPQ_CATALOG_INFO structure***\n" );
dprintf( "\t\t Next : 0x%x\n", ci->Next );
dprintf( "\t\t CatalogFileFromInf : 0x%x\n", ci->CatalogFileFromInf );
dprintf( "\t\t AltCatalogFileFromInf : 0x%x\n", ci->AltCatalogFileFromInf );
dprintf( "\t\t AltCatalogFileFromInfPending : 0x%x\n", ci->AltCatalogFileFromInfPending );
dprintf( "\t\t InfFullPath : 0x%x\n", ci->InfFullPath );
dprintf( "\t\t InfOriginalName : 0x%x\n", ci->InfOriginalName );
dprintf( "\t\t InfFinalPath : 0x%x\n", ci->InfFinalPath );
dprintf( "\t\t VerificationFailureError : 0x%x\n", ci->VerificationFailureError );
dprintf( "\t\t Flags : 0x%x\n", ci->Flags );
dprintf( "\t\t CatalogFilenameOnSystem : %ws\n", ci->CatalogFilenameOnSystem );
if (ci->Next && recursive) {
if (CheckInterupted()) {
return;
}
move(next, ci->Next );
DumpCatalogInfoList( &next, mask, TRUE ) ;
}
}
VOID
DumpUnwindList(
PSP_UNWIND_NODE pun,
DWORD mask,
BOOL recursive
)
{
SP_UNWIND_NODE next;
dprintf( "\t\t***SP_UNWIND_NODE structure***\n" );
dprintf( "\t\t NextNode : 0x%x\n", pun->NextNode );
dprintf( "\t\t TargetID : 0x%x\n", pun->TargetID );
dprintf( "\t\t SecurityDesc : 0x%x\n", pun->SecurityDesc );
dprintf( "\t\t CreateTime : 0x%x 0x%x\n",
pun->CreateTime.dwLowDateTime,
pun->CreateTime.dwHighDateTime );
dprintf( "\t\t AccessTime : 0x%x 0x%x\n",
pun->AccessTime.dwLowDateTime,
pun->AccessTime.dwHighDateTime );
dprintf( "\t\t WriteTime : 0x%x 0x%x\n",
pun->WriteTime.dwLowDateTime,
pun->WriteTime.dwHighDateTime );
if (pun->NextNode && recursive) {
if (CheckInterupted()) {
return;
}
move(next, pun->NextNode);
DumpUnwindList( &next, mask, TRUE );
}
}
VOID
DumpTargetEnt(
PSP_TARGET_ENT pte,
DWORD mask
)
{
dprintf( "\t\t***SP_TARGET_ENT structure***\n" );
dprintf( "\t\t TargetRoot : 0x%x\n", pte->TargetRoot );
dprintf( "\t\t TargetSubDir : 0x%x\n", pte->TargetSubDir );
dprintf( "\t\t TargetFilename : 0x%x\n", pte->TargetFilename );
dprintf( "\t\t BackupRoot : 0x%x\n", pte->BackupRoot );
dprintf( "\t\t BackupSubDir : 0x%x\n", pte->BackupSubDir );
dprintf( "\t\t BackupFilename : 0x%x\n", pte->BackupFilename );
dprintf( "\t\t NewTargetFilename : 0x%x\n", pte->NewTargetFilename );
dprintf( "\t\t InternalFlags : 0x%x\n", pte->InternalFlags );
}
VOID
DumpDelayMoveList(
PSP_DELAYMOVE_NODE pdn,
DWORD mask,
BOOL recursive
)
{
SP_DELAYMOVE_NODE next;
dprintf( "\t\t***SP_DELAYMOVE_NODE structure***\n" );
dprintf( "\t\t NextNode : 0x%x\n", pdn->NextNode );
dprintf( "\t\t SourceFilename : 0x%x\n", pdn->SourceFilename );
dprintf( "\t\t TargetFilename : 0x%x\n", pdn->TargetFilename );
dprintf( "\t\t SecurityDesc (stringtable index) : 0x%x\n", pdn->SecurityDesc );
if (pdn->NextNode && recursive) {
if (CheckInterupted()) {
return;
}
move(next,pdn->NextNode);
DumpDelayMoveList( &next, mask, TRUE );
}
}
DECLARE_API( queue )
/*++
Routine Description:
This debugger extension dumps the data related to a HSPFILEQ
Arguments:
Return Value:
--*/
{
DWORD ReturnLength;
PVOID pfq,pst;
SP_FILE_QUEUE fq;
PSP_TARGET_ENT pte;
DWORD i;
DWORD_PTR offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
DWORD Mask = 0;
//BOOL val;
INIT_API();
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
pfq = (PVOID)GetExpression( lpArgumentString );
while (*lpArgumentString && (*lpArgumentString != ' ') ) {
lpArgumentString++;
}
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
if (*lpArgumentString) {
Mask = (DWORD)GetExpression( lpArgumentString );
}
move( fq , pfq );
dprintf("SP_FILE_QUEUE at :\t0x%08x\n", (ULONG_PTR) pfq);
dprintf("\t BackupQueue : 0x%08x\n", fq.BackupQueue);
dprintf("\t DeleteQueue : 0x%08x\n", fq.DeleteQueue);
dprintf("\t RenameQueue : 0x%08x\n", fq.RenameQueue);
dprintf("\t CopyNodeCount : 0x%08x\n", fq.CopyNodeCount);
dprintf("\t DeleteNodeCount : 0x%08x\n", fq.DeleteNodeCount);
dprintf("\t RenameNodeCount : 0x%08x\n", fq.RenameNodeCount);
dprintf("\t BackupNodeCount : 0x%08x\n", fq.BackupNodeCount);
dprintf("\t SourceMediaList : 0x%08x\n", fq.SourceMediaList);
dprintf("\t SourceMediaCount : 0x%08x\n", fq.SourceMediaCount);
dprintf("\t CatalogList : 0x%08x\n", fq.CatalogList);
dprintf("\t DriverSigningPolicy : 0x%08x (%s)\n",
fq.DriverSigningPolicy,
(fq.DriverSigningPolicy == DRIVERSIGN_BLOCKING) ? "DRIVERSIGN_BLOCKING" :
(fq.DriverSigningPolicy == DRIVERSIGN_WARNING) ? "DRIVERSIGN_WARNING" :
"DRIVERSIGN_NONE" );
dprintf("\t hWndDriverSigningUi : 0x%08x\n", fq.hWndDriverSigningUi);
dprintf("\t DeviceDescStringId : 0x%08x\n", fq.DeviceDescStringId);
dprintf("\t AltPlatformInfo : 0x%08x\n", fq.AltPlatformInfo);
DumpAltPlatformInfo( &fq.AltPlatformInfo, Mask );
dprintf("\t AltCatalogFile : 0x%08x\n", fq.AltCatalogFile);
dprintf("\t StringTable : 0x%08x\n", fq.StringTable);
dprintf("\t LockRefCount : 0x%08x\n", fq.LockRefCount);
dprintf("\t Flags : 0x%08x\n", fq.Flags);
dprintf("\t SisSourceHandle : 0x%08x\n", fq.SisSourceHandle);
dprintf("\t SisSourceDirectory : 0x%08x\n", fq.SisSourceDirectory);
dprintf("\t BackupInfID : 0x%08x\n", fq.BackupInfID);
dprintf("\t TargetLookupTable : 0x%08x\n", fq.TargetLookupTable);
dprintf("\t UnwindQueue : 0x%08x\n", fq.UnwindQueue);
dprintf("\t DelayMoveQueue : 0x%08x\n", fq.DelayMoveQueue);
dprintf("\t DelayMoveQueueTail : 0x%08x\n", fq.DelayMoveQueueTail);
dprintf("\t Signature : 0x%08x (%s)\n",
fq.Signature,
(fq.Signature == SP_FILE_QUEUE_SIG) ? "VALID" : "INVALID" );
//
// dump the queue nodes
//
if (Mask & 1) {
SP_FILE_QUEUE_NODE qnode;
SOURCE_MEDIA_INFO smi;
if (fq.BackupQueue) {
move(qnode, fq.BackupQueue);
dprintf("\t ***BackupQueue***\n");
DumpFileQueueNodeList( &qnode, Mask, TRUE );
}
if (fq.DeleteQueue) {
move(qnode, fq.DeleteQueue);
dprintf("\t ***DeleteQueue***\n");
DumpFileQueueNodeList( &qnode, Mask, TRUE );
}
if (fq.RenameQueue) {
move(qnode, fq.RenameQueue);
dprintf("\t ***RenameQueue***\n");
DumpFileQueueNodeList( &qnode, Mask, TRUE );
}
if (fq.SourceMediaList) {
move(smi, fq.SourceMediaList);
dprintf("\t ***source media list***\n");
DumpSourceMediaInfoList( &smi, Mask, TRUE );
}
}
//
// dump the catalog info
//
if (Mask & 2) {
SPQ_CATALOG_INFO ci;
if (fq.CatalogList) {
move(ci, fq.CatalogList);
dprintf("\t ***CatalogList***\n");
DumpCatalogInfoList( &ci, Mask, TRUE );
}
}
//
// dump the string table
//
if (Mask & 4) {
dprintf("\t ***StringTable***\n");
move ( st, fq.StringTable ) ;
DumpStringTableHeader( &st );
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\tData at hash bucket %d\n", i);
while (node) {
dprintf("\t\tEntry Name:\t%ws (0x%08x)\n", node->String, offset);
pextradata = st.Data + offset + (wcslen(node->String) + 1)*sizeof(WCHAR) + sizeof(DWORD);
dprintf("\tExtra Data:\t0x%p\n", pextradata );
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
dprintf("\t ***TargetLookupTable***\n");
move ( st, fq.TargetLookupTable ) ;
DumpStringTableHeader( &st );
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\tData at hash bucket %d\n", i);
while (node) {
dprintf("\t\tEntry Name:\t%ws (0x%08x)\n", node->String, offset);
pte = GetStringNodeExtraData( node );
DumpTargetEnt( pte, Mask );
free( pte );
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
}
//
// backup stuff
//
if (Mask & 8) {
SP_UNWIND_NODE un;
SP_DELAYMOVE_NODE dnode;
if (fq.UnwindQueue) {
move(un, fq.UnwindQueue);
dprintf("\t ***UnwindQueue***\n");
DumpUnwindList( &un, Mask, TRUE );
}
if (fq.DelayMoveQueue) {
move(dnode, fq.DelayMoveQueue);
dprintf("\t ***DelayMoveQueue***\n");
DumpDelayMoveList( &dnode, Mask, TRUE );
}
if (fq.DelayMoveQueueTail) {
move(dnode, fq.DelayMoveQueueTail);
dprintf("\t ***DelayMoveQueueTail***\n");
DumpDelayMoveList( &dnode, Mask, TRUE );
}
}
}
DECLARE_API( qcontext )
/*++
Routine Description:
This debugger extension dumps the data related to a queue context structure
Arguments:
Return Value:
--*/
{
DWORD ReturnLength;
PVOID pqc;
QUEUECONTEXT qc;
DWORD i, offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
//BOOL val;
INIT_API();
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
pqc = (PVOID)GetExpression( lpArgumentString );
move( qc , pqc );
dprintf("QUEUECONTEXT at :\t0x%08x\n", (ULONG_PTR) pqc);
dprintf("\t OwnerWindow : 0x%08x\n", qc.OwnerWindow);
dprintf("\t MainThreadId : 0x%08x\n", qc.MainThreadId);
dprintf("\t ProgressDialog : 0x%08x\n", qc.ProgressDialog);
dprintf("\t ProgressBar : 0x%08x\n", qc.ProgressBar);
dprintf("\t Cancelled : 0x%08x\n", qc.Cancelled);
dprintf("\t CurrentSourceName : %ws\n", qc.CurrentSourceName);
dprintf("\t ScreenReader : 0x%08x\n", qc.ScreenReader);
dprintf("\t MessageBoxUp : 0x%08x\n", qc.MessageBoxUp);
dprintf("\t PendingUiType : 0x%08x\n", qc.PendingUiType);
dprintf("\t PendingUiParameters : 0x%08x\n", qc.PendingUiParameters);
dprintf("\t CancelReturnCode : 0x%08x\n", qc.CancelReturnCode);
dprintf("\t DialogKilled : 0x%08x\n", qc.DialogKilled);
dprintf("\t AlternateProgressWindow : 0x%08x\n", qc.AlternateProgressWindow);
dprintf("\t ProgressMsg : 0x%08x\n", qc.ProgressMsg);
dprintf("\t NoToAllMask : 0x%08x\n", qc.NoToAllMask);
dprintf("\t UiThreadHandle : 0x%08x\n", qc.UiThreadHandle);
}
//#include "inf.h"
VOID
DumpInfLine(
PINF_LINE line,
PBYTE valuedata
)
{
DWORD i;
PVOID ptr;
ULONG_PTR data;
// dprintf("***INF_LINE***\n");
dprintf("\t ValueCount : 0x%x\n", line->ValueCount);
dprintf("\t Flags : 0x%x\n", line->Flags);
dprintf("\t Values : 0x%x\n", line->Values);
if (line->Flags > 3) {
return;
}
for (i = 0; i< line->ValueCount; i++) {
ptr = valuedata + (ULONG_PTR)(line->Values *sizeof(ULONG_PTR)) + (ULONG_PTR)(i*sizeof(ULONG_PTR));
move ( data, valuedata + (ULONG_PTR)(line->Values *sizeof(ULONG_PTR)) + (ULONG_PTR)(i*sizeof(ULONG_PTR)) );
dprintf("\t data [%d] : 0x%x [0x%x]\n", i, ptr,data );
if (CheckInterupted()) {
return;
}
}
}
VOID
DumpInfSection(
PINF_SECTION section,
PBYTE linedata,
PBYTE valuedata
)
{
DWORD i;
INF_LINE line;
PBYTE data;
dprintf("***INF_SECTION***\n");
dprintf("\t SectionName : 0x%x\n", section->SectionName);
dprintf("\t LineCount : 0x%x\n", section->LineCount);
dprintf("\t Lines : 0x%x\n", section->Lines);
for (i = 0; i< section->LineCount; i++) {
data = linedata + (sizeof(INF_LINE)*section->Lines) + (ULONG_PTR)(sizeof(INF_LINE)*i);
dprintf("***INF_LINE [%i] at 0x%x***\n",i, data);
moveBlock ( line, (PBYTE) linedata + (sizeof(INF_LINE)*section->Lines) + (ULONG_PTR)(sizeof(INF_LINE)*i), sizeof(INF_LINE) );
DumpInfLine(&line, valuedata);
if (CheckInterupted()) {
return;
}
}
}
VOID
DumpInfVersionNode(
PINF_VERSION_NODE ver
)
{
PWSTR Data;
dprintf("***INF_VERSION_NODE***\n");
dprintf("\t FilenameSize : 0x%x\n", ver->FilenameSize);
dprintf("\t DataBlock : 0x%x\n", ver->DataBlock);
dprintf("\t DataSize : 0x%x\n", ver->DataSize);
dprintf("\t DatumCount : 0x%x\n", ver->DatumCount);
dprintf("\t Filename : %ws\n", ver->Filename);
return;
Data = malloc(ver->DataSize);
if (!Data) {
return;
}
moveBlock(Data, ver->DataBlock, ver->DataSize);
dprintf("\t %ws\n", Data );
free( Data );
}
VOID
DumpUserDirId(
PUSERDIRID dirid
)
{
dprintf("***USERDIRID***\n");
dprintf("\t Id : 0x%x\n", dirid->Id);
dprintf("\t Directory : %ws\n", dirid->Directory);
}
VOID
DumpUserDirIdList(
PUSERDIRID_LIST list
)
{
USERDIRID dirid;
UINT i;
dprintf("***USERDIRID_LIST***\n");
dprintf("\t UserDirIds : 0x%x\n", list->UserDirIds);
dprintf("\t UserDirIdCount : 0x%x\n", list->UserDirIdCount);
for (i = 0; i < list->UserDirIdCount; i++) {
moveBlock(dirid, ((LPBYTE)list->UserDirIds) + (ULONG_PTR)(sizeof(ULONG_PTR)*i) , sizeof(USERDIRID));
DumpUserDirId(&dirid);
if (CheckInterupted()) {
return;
}
}
}
VOID
DumpStringSubstNode(
PSTRINGSUBST_NODE node
)
{
dprintf("***STRINGSUBST_NODE***\n");
dprintf("\t ValueOffset : 0x%x\n", node->ValueOffset);
dprintf("\t TemplateStringId : 0x%x\n", node->TemplateStringId);
dprintf("\t CaseSensitive : 0x%x\n", node->CaseSensitive);
}
DECLARE_API( infdump )
/*++
Routine Description:
This debugger extension dumps the data related to an HINF structure
Arguments:
Return Value:
--*/
{
DWORD ReturnLength;
PVOID pinf;
LOADED_INF inf;
INF_SECTION InfSection;
INF_LINE InfLine;
DWORD i;
DWORD_PTR offset;
PVOID stdata,pextradata;
STRING_TABLE st;
PSTRING_NODEW node;//, prev;
//BOOL val;
INIT_API();
while (*lpArgumentString == ' ') {
lpArgumentString++;
}
pinf = (PVOID)GetExpression( lpArgumentString );
move( inf , pinf );
dprintf("LOADED_INF at :\t0x%x\n", (ULONG_PTR) pinf);
dprintf("\t Signature : 0x%08x ( %s )\n", inf.Signature,
inf.Signature == LOADED_INF_SIG ? "Valid" : "Invalid");
if (inf.Signature != LOADED_INF_SIG) {
return;
}
dprintf("\t FileHandle : 0x%x\n", inf.FileHandle);
dprintf("\t MappingHandle : 0x%x\n", inf.MappingHandle);
dprintf("\t ViewAddress : 0x%x\n", inf.ViewAddress);
if (inf.FileHandle == INVALID_HANDLE_VALUE) {
dprintf(" *** In memory INF ***\n" );
} else {
dprintf(" *** PNF ***\n" );
}
dprintf("\t StringTable : 0x%x\n", inf.StringTable);
dprintf("\t SectionCount : 0x%x\n", inf.SectionCount);
dprintf("\tSectionBlock : 0x%x\n", inf.SectionBlock);
for (i = 0; i < inf.SectionCount; i++) {
dprintf("***INF_SECTION [%d] at 0x%x***\n",i, (PBYTE)inf.SectionBlock + (ULONG_PTR)(sizeof(INF_SECTION)*i));
move (InfSection, (PBYTE)inf.SectionBlock + (ULONG_PTR)(sizeof(INF_SECTION)*i) );
DumpInfSection( &InfSection, (PBYTE)inf.LineBlock, (PBYTE)inf.ValueBlock );
if (CheckInterupted()) {
return;
}
}
dprintf("\tLineBlock : 0x%x\n", inf.LineBlock);
// move (InfLine, inf.LineBlock );
// DumpInfLine( &InfLine ) ;
dprintf("\t ValueBlock : 0x%x\n", inf.ValueBlock);
DumpInfVersionNode(&inf.VersionBlock);
dprintf("\t HasStrings : 0x%x\n", inf.HasStrings);
dprintf("\t OsLoaderPath : %ws\n", inf.OsLoaderPath);
dprintf("\t InfSourceMediaType : 0x%x ( ", inf.InfSourceMediaType);
if (inf.InfSourceMediaType) {
if (inf.InfSourceMediaType & SPOST_PATH ) {
dprintf("SPOST_PATH ");
}
if (inf.InfSourceMediaType & SPOST_URL) {
dprintf("SPOST_URL ");
}
} else {
dprintf("SPOST_NONE ");
}
dprintf(")\n");
dprintf("\t InfSourcePath : %ws\n", inf.InfSourcePath);
dprintf("\t OriginalInfName : %ws\n", inf.OriginalInfName);
dprintf("\t SubstValueList : 0x%x\n", inf.SubstValueList);
dprintf("\t SubstValueCount : 0x%x\n", inf.SubstValueCount);
dprintf("\t Style : 0x%x ( ", inf.Style);
if (inf.Style & INF_STYLE_OLDNT) {
dprintf("INF_STYLE_OLDNT ");
}
if (inf.Style & INF_STYLE_WIN4) {
dprintf("INF_STYLE_WIN4 ");
}
dprintf(")\n");
dprintf("\t SectionBlockSizeBytes : 0x%x\n", inf.SectionBlockSizeBytes);
dprintf("\t LineBlockSizeBytes : 0x%x\n", inf.LineBlockSizeBytes);
dprintf("\t ValueBlockSizeBytes : 0x%x\n", inf.ValueBlockSizeBytes);
dprintf("\t LanguageId : 0x%x\n", inf.LanguageId);
dprintf("\t UserDirIdList : 0x%x\n", inf.UserDirIdList);
dprintf("\tLock[0] : 0x%x\n", inf.Lock.handles[0]);
dprintf("\tLock[1] : 0x%x\n", inf.Lock.handles[1]);
dprintf("\tPrev : 0x%x\n", inf.Prev);
dprintf("\tNext : 0x%x\n", inf.Next);
move ( st, inf.StringTable ) ;
DumpStringTableHeader( &st );
dprintf("***STRING_TABLE***\n");
stdata = GetStringTableData( &st );
if (!stdata) {
dprintf("error retrieving string table data!\n");
return;
}
//
// now, dump each node in the string table
//
for (i = 0; i<HASH_BUCKET_COUNT; i++ ) {
node = GetFirstNode(stdata, ((PULONG_PTR)stdata)[i], &offset );
if (!node) {
// dprintf("No data at hash bucket %d\n", i);
} else {
dprintf("\t\tData at hash bucket %d\n", i);
while (node) {
dprintf("\t\tEntry Name:\t%ws (0x%08x)\n", node->String, offset);
pextradata = st.Data + offset + (wcslen(node->String) + 1)*sizeof(WCHAR) + sizeof(DWORD);
dprintf("\tExtra Data:\t0x%08x\n", pextradata );
node = GetNextNode( stdata, node, &offset );
if (CheckInterupted()) {
return;
}
}
}
if (CheckInterupted()) {
return;
}
}
free( stdata );
}