AppNinja 开发手记1:debug wia wpd 利用 com 原理, 对照接口偏移量, 逆向出源代码
学习心得:对照已知数据结构,快速逆向出源代码
http://blog.csdn.net/a2831942318
Written by AppNinja 开发手记
EAX 0F24BF30 UNICODE "sn"
ECX 028866F0
EDX 0086B724 AppTools1_.0086B724
EBX 1E958370 UNICODE "IMG_0659.MOV"
ESP 0F5CFD50
EBP 0F5CFF40
ESI 1E598328
EDI 1E598328
EIP 0045B4F3 AppTools1_.0045B4F3
C 0 ES 002B 32位 0(FFFFFFFF)
P 0 CS 0023 32位 0(FFFFFFFF)
A 0 SS 002B 32位 0(FFFFFFFF)
Z 0 DS 002B 32位 0(FFFFFFFF)
S 0 FS 0053 32位 7EF80000(FFF)
T 0 GS 002B 32位 0(FFFFFFFF)
D 0
O 0 LastErr ERROR_SUCCESS (00000000)
EFL 00000202 (NO,NB,NE,A,NS,PO,GE,G)
ST0 empty 0.0
ST1 empty 0.0
ST2 empty 0.0
ST3 empty 0.0
ST4 empty 0.0
ST5 empty 0.0
ST6 empty 0.0
ST7 empty 60.000000000000000000
3 2 1 0 E S P U O Z D I
FST 0000 Cond 0 0 0 0 Err 0 0 0 0 0 0 0 0 (GT)
FCW 027F Prec NEAR,53 掩码 1 1 1 1 1 1
0064DF00 |. 57 push edi
0064DF01 |. 68 A0408900 push 008940A0
0064DF06 |. 6A 01 push 1
0064DF08 |. 53 push ebx
0064DF09 |. 68 94D99000 push 0090D994
0064DF0E |. FFD6 call esi ; ole32.CoCreateInstance
008940A0 F8 2D 5E 62 92 63 F0 4C 9A D1 3C FA 5F 17 77 5C ?^b抍餖氀<鷂w\
008940B0 F2 F6 48 68 55 31 86 4F B6 F5 26 3E EE AB 31 43 蝣HhU1哋鄂&>瞰1C
0090D994 9A 03 C0 F7 62 47 8A 48 B4 B3 76 0E F9 A1 BA 9B ?厉bG奌闯v簺
0090D9A4 03 D5 15 0C 17 D0 CE 47 90 16 7B 3F 97 87 21 CC ?.形G?{?棁!?
.data:0090D984 EC 0C F1 0A CD 2E 92 4B+stru_90D984 dd 0AF10CECh ; Data1
.data:0090D984 95 81 34 F6 AE 06 37 F3 ; DATA XREF: _sub_64DE30_DeleteVideo+44o
.data:0090D984 dw 2ECDh ; Data2
.data:0090D984 dw 4B92h ; Data3
.data:0090D984 db 95h, 81h, 34h, 0F6h, 0AEh, 6, 37h, 0F3h; Data4
.data:0090D994 ; IID stru_90D994
.data:0090D994 9A 03 C0 F7 62 47 8A 48+stru_90D994 dd 0F7C0039Ah ; Data1
.data:0090D994 B4 B3 76 0E F9 A1 BA 9B ; DATA XREF: _sub_64DE30_DeleteVideo+D9o
.data:0090D994 dw 4762h ; Data2
.data:0090D994 dw 488Ah ; Data3
.data:0090D994 db 0B4h, 0B3h, 76h, 0Eh, 0F9h, 0A1h, 0BAh, 9Bh; Data4
.data:0090D9A4 ; IID stru_90D9A4
.data:0090D9A4 03 D5 15 0C 17 D0 CE 47+stru_90D9A4 dd 0C15D503h ; Data1
.data:0090D9A4 90 16 7B 3F 97 87 21 CC ; DATA XREF: _sub_64DE30_DeleteVideo+F9o
.data:0090D9A4 dw 0D017h ; Data2
.data:0090D9A4 dw 47CEh ; Data3
.data:0090D9A4 db 90h, 16h, 7Bh, 3Fh, 97h, 87h, 21h, 0CCh; Data4
.data:0090D9B4 ; IID stru_90D9B4
.data:0090D9B4 2D 02 2D DE 80 24 BE 43+stru_90D9B4 dd 0DE2D022Dh ; Data1
.data:0090D9B4 97 F0 D1 FA 2C F9 8F 4F ; DATA XREF: _sub_64DE30_DeleteVideo+134o
.data:0090D9B4 ; sub_64E1A0+39o
.data:0090D9B4 dw 2480h ; Data2
.data:0090D9B4 dw 43BEh ; Data3
.data:0090D9B4 db 97h, 0F0h, 0D1h, 0FAh, 2Ch, 0F9h, 8Fh, 4Fh; Data4
.data:0090D9C4 ; IID stru_90D9C4
.data:0090D9C4 2F 9E A9 08 6D 6D 80 4B+stru_90D9C4 dd 8A99E2Fh ; Data1
.data:0090D9C4 AF 5A BA F2 BC BE 4C B9 ; DATA XREF: sub_64E550+280o
.data:0090D9C4 dw 6D6Dh ; Data2
.data:0090D9C4 dw 4B80h ; Data3
.data:0090D9C4 db 0AFh, 5Ah, 0BAh, 0F2h, 0BCh, 0BEh, 4Ch, 0B9h; Data4
内存数据转 guid
PortableDeviceApi.h
EXTERN_C const CLSID CLSID_PortableDeviceManager;
#ifdef __cplusplus
class DECLSPEC_UUID("0af10cec-2ecd-4b92-9581-34f6ae0637f3")
PortableDeviceManager;
#endif
00624B23 . FFD2 call edx
00624B25 . 8B4B 4C mov ecx, dword ptr [ebx+4C]
00624B28 . 8B10 mov edx, dword ptr [eax]
00624B2A . 56 push esi
ds:[1E63D4A4]=1E95F040, (UNICODE "/DCIM/100APPLE/IMG_0659.MOV")
ecx=028866F0
0F5CFF18 1E9818E8 UNICODE "IMG_0659.MOV"
0F5CFF1C 1E9818E8 UNICODE "IMG_0659.MOV"
0F5CFF20 1E972620 UNICODE "/DCIM/100APPLE/IMG_0659.MOV"
0F5CFF24 00C28CB0 UNICODE ".mov"
0F5CFF28 00C28C88 UNICODE "S_IFREG"
0F5CFF2C 00982FCC AppTools1_.00982FCC
0F5CFF30 78132C78 返回到 MSVCR80.78132C78 来自 kernel32.TlsGetValue
\\?\usb#vid_05ac&pid_129a&mi_00#0#{6ac27878-a6fa-4155-ba85-f98f491d4f33}
EXTERN_C const IID IID_IUnknown;
extern "C++"
{
MIDL_INTERFACE("00000000-0000-0000-C000-000000000046")
IUnknown
{
public:
BEGIN_INTERFACE
+0 virtual HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ _COM_Outptr_ void __RPC_FAR *__RPC_FAR *ppvObject) = 0;
+4 virtual ULONG STDMETHODCALLTYPE AddRef( void) = 0;
+8 virtual ULONG STDMETHODCALLTYPE Release( void) = 0;
MIDL_INTERFACE("a1567595-4c2f-4574-a6fa-ecef917b9a40")
IPortableDeviceManager : public IUnknown +0 +4 +8
{
public:
+12 virtual HRESULT STDMETHODCALLTYPE GetDevices(
/* [unique][out][in] */ __RPC__deref_opt_inout_opt LPWSTR *pPnPDeviceIDs,
/* [out][in] */ __RPC__inout DWORD *pcPnPDeviceIDs) = 0;
+16 virtual HRESULT STDMETHODCALLTYPE RefreshDeviceList( void) = 0;
+20 virtual HRESULT STDMETHODCALLTYPE GetDeviceFriendlyName(
/* [in] */ __RPC__in LPCWSTR pszPnPDeviceID,
/* [unique][out][in] */ __RPC__inout_opt WCHAR *pDeviceFriendlyName,
/* [out][in] */ __RPC__inout DWORD *pcchDeviceFriendlyName) = 0;
+24 virtual HRESULT STDMETHODCALLTYPE GetDeviceDescription(
/* [in] */ __RPC__in LPCWSTR pszPnPDeviceID,
/* [unique][out][in] */ __RPC__inout_opt WCHAR *pDeviceDescription,
/* [out][in] */ __RPC__inout DWORD *pcchDeviceDescription) = 0;
+28 virtual HRESULT STDMETHODCALLTYPE GetDeviceManufacturer(
/* [in] */ __RPC__in LPCWSTR pszPnPDeviceID,
/* [unique][out][in] */ __RPC__inout_opt WCHAR *pDeviceManufacturer,
/* [out][in] */ __RPC__inout DWORD *pcchDeviceManufacturer) = 0;
+32 virtual HRESULT STDMETHODCALLTYPE GetDeviceProperty(
/* [in] */ __RPC__in LPCWSTR pszPnPDeviceID,
/* [in] */ __RPC__in LPCWSTR pszDevicePropertyName,
/* [unique][out][in] */ __RPC__inout_opt BYTE *pData,
/* [unique][out][in] */ __RPC__inout_opt DWORD *pcbData,
/* [unique][out][in] */ __RPC__inout_opt DWORD *pdwType) = 0;
+36 virtual HRESULT STDMETHODCALLTYPE GetPrivateDevices(
/* [unique][out][in] */ __RPC__deref_opt_inout_opt LPWSTR *pPnPDeviceIDs,
/* [out][in] */ __RPC__inout DWORD *pcPnPDeviceIDs) = 0;
};
EXTERN_C const IID IID_IPortableDeviceValues;
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6848f6f2-3155-4f86-b6f5-263eeeab3143")
IPortableDeviceValues : public IUnknown +8
{
public:
12 virtual HRESULT STDMETHODCALLTYPE GetCount(
/* [in] */ __RPC__in DWORD *pcelt) = 0;
16 virtual HRESULT STDMETHODCALLTYPE GetAt(
/* [in] */ const DWORD index,
/* [unique][out][in] */ __RPC__inout_opt PROPERTYKEY *pKey,
/* [unique][out][in] */ __RPC__inout_opt PROPVARIANT *pValue) = 0;
20 virtual HRESULT STDMETHODCALLTYPE SetValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in const PROPVARIANT *pValue) = 0;
24 virtual HRESULT STDMETHODCALLTYPE GetValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out PROPVARIANT *pValue) = 0;
28 virtual HRESULT STDMETHODCALLTYPE SetStringValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in LPCWSTR Value) = 0;
32 virtual HRESULT STDMETHODCALLTYPE GetStringValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt LPWSTR *pValue) = 0;
36 virtual HRESULT STDMETHODCALLTYPE SetUnsignedIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const ULONG Value) = 0;
40 virtual HRESULT STDMETHODCALLTYPE GetUnsignedIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out ULONG *pValue) = 0;
44 virtual HRESULT STDMETHODCALLTYPE SetSignedIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const LONG Value) = 0;
48 virtual HRESULT STDMETHODCALLTYPE GetSignedIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out LONG *pValue) = 0;
52 virtual HRESULT STDMETHODCALLTYPE SetUnsignedLargeIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const ULONGLONG Value) = 0;
56 virtual HRESULT STDMETHODCALLTYPE GetUnsignedLargeIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out ULONGLONG *pValue) = 0;
60 virtual HRESULT STDMETHODCALLTYPE SetSignedLargeIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const LONGLONG Value) = 0;
64 virtual HRESULT STDMETHODCALLTYPE GetSignedLargeIntegerValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out LONGLONG *pValue) = 0;
68 virtual HRESULT STDMETHODCALLTYPE SetFloatValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const FLOAT Value) = 0;
72 virtual HRESULT STDMETHODCALLTYPE GetFloatValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out FLOAT *pValue) = 0;
76 virtual HRESULT STDMETHODCALLTYPE SetErrorValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const HRESULT Value) = 0;
80 virtual HRESULT STDMETHODCALLTYPE GetErrorValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out HRESULT *pValue) = 0;
84 virtual HRESULT STDMETHODCALLTYPE SetKeyValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in REFPROPERTYKEY Value) = 0;
88 virtual HRESULT STDMETHODCALLTYPE GetKeyValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out PROPERTYKEY *pValue) = 0;
92 virtual HRESULT STDMETHODCALLTYPE SetBoolValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ const BOOL Value) = 0;
96 virtual HRESULT STDMETHODCALLTYPE GetBoolValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out BOOL *pValue) = 0;
100 virtual HRESULT STDMETHODCALLTYPE SetIUnknownValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in_opt IUnknown *pValue) = 0;
104 virtual HRESULT STDMETHODCALLTYPE GetIUnknownValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt IUnknown **ppValue) = 0;
108 virtual HRESULT STDMETHODCALLTYPE SetGuidValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in REFGUID Value) = 0;
112 virtual HRESULT STDMETHODCALLTYPE GetGuidValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__out GUID *pValue) = 0;
116 virtual HRESULT STDMETHODCALLTYPE SetBufferValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [size_is][in] */ __RPC__in_ecount_full(cbValue) BYTE *pValue,
/* [in] */ DWORD cbValue) = 0;
120 virtual HRESULT STDMETHODCALLTYPE GetBufferValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [size_is][size_is][out] */ __RPC__deref_out_ecount_full_opt(*pcbValue) BYTE **ppValue,
/* [out] */ __RPC__out DWORD *pcbValue) = 0;
124 virtual HRESULT STDMETHODCALLTYPE SetIPortableDeviceValuesValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in_opt IPortableDeviceValues *pValue) = 0;
128 virtual HRESULT STDMETHODCALLTYPE GetIPortableDeviceValuesValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt IPortableDeviceValues **ppValue) = 0;
132 virtual HRESULT STDMETHODCALLTYPE SetIPortableDevicePropVariantCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in_opt IPortableDevicePropVariantCollection *pValue) = 0;
136 virtual HRESULT STDMETHODCALLTYPE GetIPortableDevicePropVariantCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt IPortableDevicePropVariantCollection **ppValue) = 0;
140 virtual HRESULT STDMETHODCALLTYPE SetIPortableDeviceKeyCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in_opt IPortableDeviceKeyCollection *pValue) = 0;
144 virtual HRESULT STDMETHODCALLTYPE GetIPortableDeviceKeyCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt IPortableDeviceKeyCollection **ppValue) = 0;
148 virtual HRESULT STDMETHODCALLTYPE SetIPortableDeviceValuesCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [in] */ __RPC__in_opt IPortableDeviceValuesCollection *pValue) = 0;
152 virtual HRESULT STDMETHODCALLTYPE GetIPortableDeviceValuesCollectionValue(
/* [in] */ __RPC__in REFPROPERTYKEY key,
/* [out] */ __RPC__deref_out_opt IPortableDeviceValuesCollection **ppValue) = 0;
156 virtual HRESULT STDMETHODCALLTYPE RemoveValue(
/* [in] */ __RPC__in REFPROPERTYKEY key) = 0;
160 virtual HRESULT STDMETHODCALLTYPE CopyValuesFromPropertyStore(
/* [in] */ __RPC__in_opt IPropertyStore *pStore) = 0;
164 virtual HRESULT STDMETHODCALLTYPE CopyValuesToPropertyStore(
/* [in] */ __RPC__in_opt IPropertyStore *pStore) = 0;
168 virtual HRESULT STDMETHODCALLTYPE Clear( void) = 0;
};
204D9F0C
MIDL_INTERFACE("625e2df8-6392-4cf0-9ad1-3cfa5f17775c")
IPortableDevice : public IUnknown
{
public:
12 virtual HRESULT STDMETHODCALLTYPE Open(
/* [in] */ __RPC__in LPCWSTR pszPnPDeviceID,
/* [in] */ __RPC__in_opt IPortableDeviceValues *pClientInfo) = 0;
16 virtual HRESULT STDMETHODCALLTYPE SendCommand(
/* [in] */ const DWORD dwFlags,
/* [in] */ __RPC__in_opt IPortableDeviceValues *pParameters,
/* [out] */ __RPC__deref_out_opt IPortableDeviceValues **ppResults) = 0;
20 virtual HRESULT STDMETHODCALLTYPE Content(
/* [out] */ __RPC__deref_out_opt IPortableDeviceContent **ppContent) = 0;
24 virtual HRESULT STDMETHODCALLTYPE Capabilities(
/* [out] */ __RPC__deref_out_opt IPortableDeviceCapabilities **ppCapabilities) = 0;
28 virtual HRESULT STDMETHODCALLTYPE Cancel( void) = 0;
32 virtual HRESULT STDMETHODCALLTYPE Close( void) = 0;
36 virtual HRESULT STDMETHODCALLTYPE Advise(
/* [in] */ const DWORD dwFlags,
/* [in] */ __RPC__in_opt IPortableDeviceEventCallback *pCallback,
/* [unique][in] */ __RPC__in_opt IPortableDeviceValues *pParameters,
/* [out] */ __RPC__deref_out_opt LPWSTR *ppszCookie) = 0;
40 virtual HRESULT STDMETHODCALLTYPE Unadvise(
/* [in] */ __RPC__in LPCWSTR pszCookie) = 0;
44 virtual HRESULT STDMETHODCALLTYPE GetPnPDeviceID(
/* [out] */ __RPC__deref_out_opt LPWSTR *ppszPnPDeviceID) = 0;
};
EXTERN_C const IID IID_IPortableDeviceKeyCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dada2357-e0ad-492e-98db-dd61c53ba353")
IPortableDeviceKeyCollection : public IUnknown
{
public:
12 virtual HRESULT STDMETHODCALLTYPE GetCount(
/* [in] */ __RPC__in DWORD *pcElems) = 0;
16 virtual HRESULT STDMETHODCALLTYPE GetAt(
/* [in] */ const DWORD dwIndex,
/* [in] */ __RPC__in PROPERTYKEY *pKey) = 0;
20 virtual HRESULT STDMETHODCALLTYPE Add(
/* [in] */ __RPC__in REFPROPERTYKEY Key) = 0;
virtual HRESULT STDMETHODCALLTYPE Clear( void) = 0;
virtual HRESULT STDMETHODCALLTYPE RemoveAt(
/* [in] */ const DWORD dwIndex) = 0;
};
// DevList.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <devguid.h> // for GUID_DEVCLASS_CDROM etc
#include <setupapi.h>
#include <cfgmgr32.h> // for MAX_DEVICE_ID_LEN, CM_Get_Parent and CM_Get_Device_ID
#define INITGUID
#include <tchar.h>
#include <stdio.h>
//#include "c:\WinDDK\7600.16385.1\inc\api\devpkey.h"
// include DEVPKEY_Device_BusReportedDeviceDesc from WinDDK\7600.16385.1\inc\api\devpropdef.h
#ifdef DEFINE_DEVPROPKEY
#undef DEFINE_DEVPROPKEY
#endif
#ifdef INITGUID
#define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const DEVPROPKEY DECLSPEC_SELECTANY name = { { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }, pid }
#else
#define DEFINE_DEVPROPKEY(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8, pid) EXTERN_C const DEVPROPKEY name
#endif // INITGUID
// include DEVPKEY_Device_BusReportedDeviceDesc from WinDDK\7600.16385.1\inc\api\devpkey.h
DEFINE_DEVPROPKEY(DEVPKEY_Device_BusReportedDeviceDesc, 0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2, 4); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_ContainerId, 0x8c7ed206, 0x3f8a, 0x4827, 0xb3, 0xab, 0xae, 0x9e, 0x1f, 0xae, 0xfc, 0x6c, 2); // DEVPROP_TYPE_GUID
DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_DeviceDisplay_Category, 0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57, 0x5a); // DEVPROP_TYPE_STRING_LIST
DEFINE_DEVPROPKEY(DEVPKEY_Device_LocationInfo, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 15); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_Manufacturer, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 13); // DEVPROP_TYPE_STRING
DEFINE_DEVPROPKEY(DEVPKEY_Device_SecuritySDS, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 26); // DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING
#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
#pragma comment (lib, "setupapi.lib")
typedef BOOL(WINAPI *FN_SetupDiGetDevicePropertyW)(
__in HDEVINFO DeviceInfoSet,
__in PSP_DEVINFO_DATA DeviceInfoData,
__in const DEVPROPKEY *PropertyKey,
__out DEVPROPTYPE *PropertyType,
__out_opt PBYTE PropertyBuffer,
__in DWORD PropertyBufferSize,
__out_opt PDWORD RequiredSize,
__in DWORD Flags
);
// List all USB devices with some additional information
void ListDevices(CONST GUID *pClassGuid, LPCTSTR pszEnumerator)
{
unsigned i, j;
DWORD dwSize, dwPropertyRegDataType;
DEVPROPTYPE ulPropertyType;
CONFIGRET status;
HDEVINFO hDevInfo;
SP_DEVINFO_DATA DeviceInfoData;
const static LPCTSTR arPrefix[3] = { TEXT("VID_"), TEXT("PID_"), TEXT("MI_") };
TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
TCHAR szDesc[1024], szHardwareIDs[4096];
WCHAR szBuffer[4096];
LPTSTR pszToken, pszNextToken;
TCHAR szVid[MAX_DEVICE_ID_LEN], szPid[MAX_DEVICE_ID_LEN], szMi[MAX_DEVICE_ID_LEN];
FN_SetupDiGetDevicePropertyW fn_SetupDiGetDevicePropertyW = (FN_SetupDiGetDevicePropertyW)
GetProcAddress(GetModuleHandle(TEXT("Setupapi.dll")), "SetupDiGetDevicePropertyW");
// List all connected USB devices
hDevInfo = SetupDiGetClassDevs(pClassGuid, pszEnumerator, NULL,
pClassGuid != NULL ? DIGCF_PRESENT : DIGCF_ALLCLASSES | DIGCF_PRESENT);
if (hDevInfo == INVALID_HANDLE_VALUE)
return;
// Find the ones that are driverless
for (i = 0;; i++) {
DeviceInfoData.cbSize = sizeof (DeviceInfoData);
if (!SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData))
break;
status = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_PATH, 0);
if (status != CR_SUCCESS)
continue;
// Display device instance ID
_tprintf(TEXT("%s\n"), szDeviceInstanceID);
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER,
&dwPropertyRegDataType, (BYTE*)szDesc,
sizeof(szDesc), // The size, in bytes
&dwSize))
_tprintf(TEXT(" Driver: \"%s\"\n"), szDesc);
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC,
&dwPropertyRegDataType, (BYTE*)szDesc,
sizeof(szDesc), // The size, in bytes
&dwSize))
_tprintf(TEXT(" Device Description: \"%s\"\n"), szDesc);
if (SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_HARDWAREID,
&dwPropertyRegDataType, (BYTE*)szHardwareIDs,
sizeof(szHardwareIDs), // The size, in bytes
&dwSize)) {
LPCTSTR pszId;
_tprintf(TEXT(" Hardware IDs:\n"));
for (pszId = szHardwareIDs;
*pszId != TEXT('\0') && pszId + dwSize / sizeof(TCHAR) <= szHardwareIDs + ARRAYSIZE(szHardwareIDs);
pszId += lstrlen(pszId) + 1) {
_tprintf(TEXT(" \"%s\"\n"), pszId);
}
}
// Retreive the device description as reported by the device itself
// On Vista and earlier, we can use only SPDRP_DEVICEDESC
// On Windows 7, the information we want ("Bus reported device description") is
// accessed through DEVPKEY_Device_BusReportedDeviceDesc
if (fn_SetupDiGetDevicePropertyW && fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
_tprintf(TEXT(" Bus Reported Device Description: \"%ls\"\n"), szBuffer);
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_Manufacturer,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
_tprintf(TEXT(" Device Manufacturer: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_FriendlyName,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
_tprintf(TEXT(" Device Friendly Name: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_LocationInfo,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
_tprintf(TEXT(" Device Location Info: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_SecuritySDS,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {
// See Security Descriptor Definition Language on MSDN
// (http://msdn.microsoft.com/en-us/library/windows/desktop/aa379567(v=vs.85).aspx)
_tprintf(TEXT(" Device Security Descriptor String: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_Device_ContainerId,
&ulPropertyType, (BYTE*)szDesc, sizeof(szDesc), &dwSize, 0)) {
StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
_tprintf(TEXT(" ContainerId: \"%ls\"\n"), szBuffer);
}
if (fn_SetupDiGetDevicePropertyW(hDevInfo, &DeviceInfoData, &DEVPKEY_DeviceDisplay_Category,
&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0))
_tprintf(TEXT(" Device Display Category: \"%ls\"\n"), szBuffer);
}
pszToken = _tcstok_s(szDeviceInstanceID, TEXT("\\#&"), &pszNextToken);
while (pszToken != NULL) {
szVid[0] = TEXT('\0');
szPid[0] = TEXT('\0');
szMi[0] = TEXT('\0');
for (j = 0; j < 3; j++) {
if (_tcsncmp(pszToken, arPrefix[j], lstrlen(arPrefix[j])) == 0) {
switch (j) {
case 0:
_tcscpy_s(szVid, ARRAY_SIZE(szVid), pszToken);
break;
case 1:
_tcscpy_s(szPid, ARRAY_SIZE(szPid), pszToken);
break;
case 2:
_tcscpy_s(szMi, ARRAY_SIZE(szMi), pszToken);
break;
default:
break;
}
}
}
if (szVid[0] != TEXT('\0'))
_tprintf(TEXT(" vid: \"%s\"\n"), szVid);
if (szPid[0] != TEXT('\0'))
_tprintf(TEXT(" pid: \"%s\"\n"), szPid);
if (szMi[0] != TEXT('\0'))
_tprintf(TEXT(" mi: \"%s\"\n"), szMi);
pszToken = _tcstok_s(NULL, TEXT("\\#&"), &pszNextToken);
}
}
return;
}
int _tmain(int argc, _TCHAR* argv[])
{
// List all connected USB devices
_tprintf(TEXT("---------------\n"));
_tprintf(TEXT("- USB devices -\n"));
_tprintf(TEXT("---------------\n"));
ListDevices(NULL, TEXT("USB"));
_tprintf(TEXT("\n"));
_tprintf(TEXT("-------------------\n"));
_tprintf(TEXT("- USBSTOR devices -\n"));
_tprintf(TEXT("-------------------\n"));
ListDevices(NULL, TEXT("USBSTOR"));
getchar();
_tprintf(TEXT("\n"));
_tprintf(TEXT("--------------\n"));
_tprintf(TEXT("- SD devices -\n"));
_tprintf(TEXT("--------------\n"));
ListDevices(NULL, TEXT("SD"));
//_tprintf (TEXT("\n"));
//ListDevices(&GUID_DEVCLASS_USB, NULL);
//_tprintf (TEXT("\n"));
_tprintf(TEXT("\n"));
_tprintf(TEXT("-----------\n"));
_tprintf(TEXT("- Volumes -\n"));
_tprintf(TEXT("-----------\n"));
//ListDevices(NULL, TEXT("STORAGE\\VOLUME"));
//_tprintf (TEXT("\n"));
ListDevices(&GUID_DEVCLASS_VOLUME, NULL);
_tprintf(TEXT("\n"));
_tprintf(TEXT("----------------------------\n"));
_tprintf(TEXT("- devices with disk drives -\n"));
_tprintf(TEXT("----------------------------\n"));
ListDevices(&GUID_DEVCLASS_DISKDRIVE, NULL);
return 0;
}