📄 dump.cpp
字号:
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(__in HDEVINFO Devs, __in 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(__in HDEVINFO Devs, __in 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;
}
BOOL DumpDriverPackageData(__in LPCTSTR InfName)
{
DWORD Err = NO_ERROR;
HINF hInf = INVALID_HANDLE_VALUE;
UINT ErrorLine;
INFCONTEXT Context;
TCHAR InfData[MAX_INF_STRING_LENGTH];
GUID ClassGuid;
#if _SETUPAPI_VER >= _WIN32_WINNT_WINXP
SetupVerifyInfFileProto SVIFFn;
#endif // _SETUPAPI_VER >= _WIN32_WINNT_WINXP
HMODULE setupapiMod = NULL;
#if _SETUPAPI_VER >= _WIN32_WINNT_WINXP
SP_INF_SIGNER_INFO InfSignerInfo;
#endif // _SETUPAPI_VER >= _WIN32_WINNT_WINXP
hInf = SetupOpenInfFile(InfName,
NULL,
INF_STYLE_WIN4,
&ErrorLine);
if (hInf == INVALID_HANDLE_VALUE) {
Err = GetLastError();
goto failed;
}
//
// Dump out the provider.
//
if (SetupFindFirstLine(hInf,
INFSTR_SECT_VERSION,
INFSTR_KEY_PROVIDER,
&Context) &&
(SetupGetStringField(&Context,
1,
InfData,
ARRAYSIZE(InfData),
NULL))) {
FormatToStream(stdout,MSG_DPENUM_DUMP_PROVIDER,InfData);
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_PROVIDER_UNKNOWN);
}
//
// Dump out the class
//
if (SetupFindFirstLine(hInf,
INFSTR_SECT_VERSION,
INFSTR_KEY_HARDWARE_CLASSGUID,
&Context) &&
(SetupGetStringField(&Context,
1,
InfData,
ARRAYSIZE(InfData),
NULL)) &&
(SUCCEEDED(CLSIDFromString(InfData, &ClassGuid))) &&
SetupDiGetClassDescriptionEx(&ClassGuid,InfData,ARRAYSIZE(InfData),NULL,NULL,NULL)) {
FormatToStream(stdout,MSG_DPENUM_DUMP_CLASS,InfData);
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_CLASS_UNKNOWN);
}
#if _SETUPAPI_VER >= _WIN32_WINNT_WINXP
//
// Dump out the digital signer
//
setupapiMod = LoadLibrary(TEXT("setupapi.dll"));
if(!setupapiMod){
goto failed;
}
SVIFFn = (SetupVerifyInfFileProto)GetProcAddress(setupapiMod, SETUPVERIFYINFFILE);
if(!SVIFFn){
goto failed;
}
ZeroMemory(&InfSignerInfo, sizeof(InfSignerInfo));
InfSignerInfo.cbSize = sizeof(InfSignerInfo);
if (SVIFFn(InfName, NULL, &InfSignerInfo) ||
(GetLastError() == ERROR_AUTHENTICODE_TRUSTED_PUBLISHER) ||
(GetLastError() == ERROR_AUTHENTICODE_TRUST_NOT_ESTABLISHED)) {
FormatToStream(stdout,MSG_DPENUM_DUMP_SIGNER,InfSignerInfo.DigitalSigner);
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_SIGNER_UNKNOWN);
}
#endif // _SETUPAPI_VER >= _WIN32_WINNT_WINXP
//
// Dump out the version and date
//
if (SetupFindFirstLine(hInf,
INFSTR_SECT_VERSION,
INFSTR_DRIVERVERSION_SECTION,
&Context)) {
if (SetupGetStringField(&Context,
1,
InfData,
ARRAYSIZE(InfData),
NULL)) {
FormatToStream(stdout,MSG_DPENUM_DUMP_DATE,InfData);
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_DATE_UNKNOWN);
}
if (SetupGetStringField(&Context,
2,
InfData,
ARRAYSIZE(InfData),
NULL)) {
FormatToStream(stdout,MSG_DPENUM_DUMP_VERSION,InfData);
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_VERSION_UNKNOWN);
}
} else {
FormatToStream(stdout,MSG_DPENUM_DUMP_DATE_UNKNOWN);
FormatToStream(stdout,MSG_DPENUM_DUMP_VERSION_UNKNOWN);
}
failed:
if (hInf != INVALID_HANDLE_VALUE) {
SetupCloseInfFile(hInf);
}
if(setupapiMod){
FreeLibrary(setupapiMod);
}
return (Err == NO_ERROR);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -