windows-nt/Source/XPSP1/NT/termsrv/setup/tsdiag/dll/drdetect.cpp
2020-09-26 16:20:57 +08:00

123 lines
2.5 KiB
C++

// Copyright (c) 1998 - 1999 Microsoft Corporation
/*++
Module Name:
drdetect
Abstract:
Detect whether RDPDR was properly installed.
Environment:
User mode
Author:
Tadb
--*/
#include "stdafx.h"
#include <setupapi.h>
////////////////////////////////////////////////////////////
//
// Internal Defines
//
#define RDPDRPNPID _T("ROOT\\RDPDR")
#define RDPDRDEVICEID TEXT("Root\\RDPDR\\0000")
const GUID GUID_DEVCLASS_SYSTEM =
{ 0x4d36e97dL, 0xe325, 0x11ce, { 0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18 } };
ULONG RDPDRINST_DetectInstall()
/*++
Routine Description:
Return the number of RDPDR.SYS devices found.
Arguments:
NA
Return Value:
TRUE on success. FALSE, otherwise.
--*/
{
HDEVINFO devInfoSet;
SP_DEVINFO_DATA deviceInfoData;
DWORD iLoop;
BOOL bMoreDevices;
ULONG count;
TCHAR pnpID[256];
GUID *pGuid=(GUID *)&GUID_DEVCLASS_SYSTEM;
//
// Get the set of all devices with the RDPDR PnP ID.
//
devInfoSet = SetupDiGetClassDevs(pGuid, NULL, NULL,
DIGCF_PRESENT);
if (devInfoSet == INVALID_HANDLE_VALUE) {
fprintf(stderr, "Error getting RDPDR devices from PnP. Error code: %ld.",
GetLastError());
return 0;
}
// Get the first device.
iLoop=0;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
bMoreDevices=SetupDiEnumDeviceInfo(devInfoSet, iLoop, &deviceInfoData);
// Get the details for all matching device interfaces.
count = 0;
while (bMoreDevices)
{
// Get the PnP ID for the device.
if (!SetupDiGetDeviceRegistryProperty(devInfoSet, &deviceInfoData,
SPDRP_HARDWAREID, NULL, (BYTE *)pnpID,
sizeof(pnpID), NULL)) {
fprintf(stderr, "Error fetching PnP ID in RDPDR device node remove. Error code: %ld.",
GetLastError());
}
// If the current device matches the RDPDR PNP ID
if (!_tcscmp(pnpID, RDPDRPNPID)) {
count++;
}
// Get the next one device interface.
bMoreDevices=SetupDiEnumDeviceInfo(devInfoSet, ++iLoop, &deviceInfoData);
}
// Release the device info list.
SetupDiDestroyDeviceInfoList(devInfoSet);
return count;
}
//
// Unit-Test
//
//void __cdecl main()
//{
// ULONG count;
// count = RDPDRINST_DetectInstall();
// printf("Found %ld instance(s) of RDPDR.SYS.\n", count);
//}