📄 dump.cpp
字号:
if ( queueHandle != (HSPFILEQ)INVALID_HANDLE_VALUE ) {
SetupCloseFileQueue(queueHandle);
}
if(!success) {
Padding(1);
FormatToStream(stdout, MSG_DUMP_NO_DRIVER);
}
return success;
}
BOOL DumpArray(int pad,LPTSTR * Array)
/*++
Routine Description:
Iterate array and dump entries to screen
Arguments:
pad - padding
Array - array to dump
Return Value:
none
--*/
{
if(!Array || !Array[0]) {
return FALSE;
}
while(Array[0]) {
Padding(pad);
_tprintf(TEXT("%s\n"),Array[0]);
Array++;
}
return TRUE;
}
BOOL DumpDeviceHwIds(HDEVINFO Devs,PSP_DEVINFO_DATA DevInfo)
/*++
Routine Description:
Write device instance & description to stdout
<tab>Hardware ID's
<tab><tab>ID
...
<tab>Compatible ID's
<tab><tab>ID
...
or
<tab>No Hardware ID's for device
Arguments:
Devs )_ uniquely identify device
DevInfo )
Return Value:
none
--*/
{
LPTSTR * hwIdArray = GetDevMultiSz(Devs,DevInfo,SPDRP_HARDWAREID);
LPTSTR * compatIdArray = GetDevMultiSz(Devs,DevInfo,SPDRP_COMPATIBLEIDS);
BOOL displayed = FALSE;
if(hwIdArray && hwIdArray[0]) {
displayed = TRUE;
Padding(1);
FormatToStream(stdout, MSG_DUMP_HWIDS);
DumpArray(2,hwIdArray);
}
if(compatIdArray && compatIdArray[0]) {
displayed = TRUE;
Padding(1);
FormatToStream(stdout, MSG_DUMP_COMPATIDS);
DumpArray(2,compatIdArray);
}
if(!displayed) {
Padding(1);
FormatToStream(stdout, MSG_DUMP_NO_HWIDS);
}
DelMultiSz(hwIdArray);
DelMultiSz(compatIdArray);
return TRUE;
}
BOOL DumpDeviceDriverNodes(HDEVINFO Devs,PSP_DEVINFO_DATA DevInfo)
/*++
Routine Description:
Write device instance & description to stdout
<tab>Installed using OEM123.INF section [abc.NT]
<tab><tab>file...
Arguments:
Devs )_ uniquely identify device
DevInfo )
Return Value:
none
--*/
{
BOOL success = FALSE;
SP_DEVINSTALL_PARAMS deviceInstallParams;
SP_DRVINFO_DATA driverInfoData;
SP_DRVINFO_DETAIL_DATA driverInfoDetail;
SP_DRVINSTALL_PARAMS driverInstallParams;
DWORD index;
SYSTEMTIME SystemTime;
ULARGE_INTEGER Version;
TCHAR Buffer[MAX_PATH];
ZeroMemory(&deviceInstallParams, sizeof(deviceInstallParams));
ZeroMemory(&driverInfoData, sizeof(driverInfoData));
driverInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
deviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
if(!SetupDiGetDeviceInstallParams(Devs, DevInfo, &deviceInstallParams)) {
return FALSE;
}
//
// Set the flags that tell SetupDiBuildDriverInfoList to allow excluded drivers.
//
deviceInstallParams.FlagsEx |= DI_FLAGSEX_ALLOWEXCLUDEDDRVS;
if(!SetupDiSetDeviceInstallParams(Devs, DevInfo, &deviceInstallParams)) {
return FALSE;
}
//
// Now build a class driver list.
//
if(!SetupDiBuildDriverInfoList(Devs, DevInfo, SPDIT_COMPATDRIVER)) {
goto final2;
}
//
// Enumerate all of the drivernodes.
//
index = 0;
while(SetupDiEnumDriverInfo(Devs, DevInfo, SPDIT_COMPATDRIVER,
index, &driverInfoData)) {
success = TRUE;
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_HEADER,index);
//
// get useful driver information
//
driverInfoDetail.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
if(SetupDiGetDriverInfoDetail(Devs,DevInfo,&driverInfoData,&driverInfoDetail,sizeof(SP_DRVINFO_DETAIL_DATA),NULL) ||
GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_INF,driverInfoDetail.InfFileName);
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_SECTION,driverInfoDetail.SectionName);
}
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_DESCRIPTION,driverInfoData.Description);
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_MFGNAME,driverInfoData.MfgName);
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_PROVIDERNAME,driverInfoData.ProviderName);
if (FileTimeToSystemTime(&driverInfoData.DriverDate, &SystemTime)) {
if (GetDateFormat(LOCALE_USER_DEFAULT,
DATE_SHORTDATE,
&SystemTime,
NULL,
Buffer,
sizeof(Buffer)/sizeof(TCHAR)
) != 0) {
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_DRIVERDATE,Buffer);
}
}
Version.QuadPart = driverInfoData.DriverVersion;
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_DRIVERVERSION,
HIWORD(Version.HighPart),
LOWORD(Version.HighPart),
HIWORD(Version.LowPart),
LOWORD(Version.LowPart)
);
driverInstallParams.cbSize = sizeof(SP_DRVINSTALL_PARAMS);
if(SetupDiGetDriverInstallParams(Devs,DevInfo,&driverInfoData,&driverInstallParams)) {
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_RANK,driverInstallParams.Rank);
Padding(1);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS,driverInstallParams.Flags);
//
// Interesting flags to dump
//
if (driverInstallParams.Flags & DNF_OLD_INET_DRIVER) {
Padding(2);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS_OLD_INET_DRIVER);
}
if (driverInstallParams.Flags & DNF_BAD_DRIVER) {
Padding(2);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS_BAD_DRIVER);
}
#if defined(DNF_INF_IS_SIGNED)
//
// DNF_INF_IS_SIGNED is only available since WinXP
//
if (driverInstallParams.Flags & DNF_INF_IS_SIGNED) {
Padding(2);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS_INF_IS_SIGNED);
}
#endif
#if defined(DNF_OEM_F6_INF)
//
// DNF_OEM_F6_INF is only available since WinXP
//
if (driverInstallParams.Flags & DNF_OEM_F6_INF) {
Padding(2);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS_OEM_F6_INF);
}
#endif
#if defined(DNF_BASIC_DRIVER)
//
// DNF_BASIC_DRIVER is only available since WinXP
//
if (driverInstallParams.Flags & DNF_BASIC_DRIVER) {
Padding(2);
FormatToStream(stdout,MSG_DUMP_DRIVERNODE_FLAGS_BASIC_DRIVER);
}
#endif
}
index++;
}
SetupDiDestroyDriverInfoList(Devs,DevInfo,SPDIT_COMPATDRIVER);
final2:
if(!success) {
Padding(1);
FormatToStream(stdout, MSG_DUMP_NO_DRIVERNODES);
}
return success;
}
BOOL DumpDeviceStack(HDEVINFO Devs,PSP_DEVINFO_DATA DevInfo)
/*++
Routine Description:
Write expected stack information to stdout
Arguments:
Devs )_ uniquely identify device
DevInfo )
Return Value:
TRUE if success
--*/
{
LPTSTR * filters;
LPTSTR service;
HKEY hClassKey = (HKEY)INVALID_HANDLE_VALUE;
SP_DEVINFO_LIST_DETAIL_DATA devInfoListDetail;
//
// we need machine information
//
devInfoListDetail.cbSize = sizeof(devInfoListDetail);
if(!SetupDiGetDeviceInfoListDetail(Devs,&devInfoListDetail)) {
return FALSE;
}
//
// we need device setup class, we can use the GUID in DevInfo
// note that this GUID is a snapshot, but works fine
// if DevInfo isn't old
//
//
// class upper/lower filters are in class registry
//
hClassKey = SetupDiOpenClassRegKeyEx(&DevInfo->ClassGuid,
KEY_READ,
DIOCR_INSTALLER,
devInfoListDetail.RemoteMachineName[0] ? devInfoListDetail.RemoteMachineName : NULL,
NULL);
if(hClassKey != INVALID_HANDLE_VALUE) {
//
// dump upper class filters if available
//
filters = GetRegMultiSz(hClassKey,REGSTR_VAL_UPPERFILTERS);
if(filters) {
if(filters[0]) {
Padding(1);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_UPPERCLASSFILTERS);
DumpArray(2,filters);
}
DelMultiSz(filters);
}
}
filters = GetDevMultiSz(Devs,DevInfo,SPDRP_UPPERFILTERS);
if(filters) {
if(filters[0]) {
//
// dump upper device filters
//
Padding(1);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_UPPERFILTERS);
DumpArray(2,filters);
}
DelMultiSz(filters);
}
service = GetDeviceStringProperty(Devs,DevInfo,SPDRP_SERVICE);
Padding(1);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_SERVICE);
if(service && service[0]) {
//
// dump service
//
Padding(2);
_tprintf(TEXT("%s\n"),service);
} else {
//
// dump the fact that there's no service
//
Padding(2);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_NOSERVICE);
}
if(service) {
delete [] service;
}
if(hClassKey != INVALID_HANDLE_VALUE) {
filters = GetRegMultiSz(hClassKey,REGSTR_VAL_LOWERFILTERS);
if(filters) {
if(filters[0]) {
//
// lower class filters
//
Padding(1);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_LOWERCLASSFILTERS);
DumpArray(2,filters);
}
DelMultiSz(filters);
}
RegCloseKey(hClassKey);
}
filters = GetDevMultiSz(Devs,DevInfo,SPDRP_LOWERFILTERS);
if(filters) {
if(filters[0]) {
//
// lower device filters
//
Padding(1);
FormatToStream(stdout,MSG_DUMP_DEVICESTACK_LOWERFILTERS);
DumpArray(2,filters);
}
DelMultiSz(filters);
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -