AppNinja 开发手记1:debug wia wpd 利用 com 原理, 对照接口偏移量, 逆向出源代码
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;
}
AppNinja 开发手记1:debug wia wpd 利用 com 原理, 对照接口偏移量, 逆向出源代码相关推荐
- AppNinja 开发手记4: dmg kernelcache解密命令
AppNinja 开发手记4: dmg kernelcache解密命令 学习心得: http://theiphonewiki.com Written by AppNinja 开发手记 rem vfde ...
- Unity 2D独立开发手记(九):UGUI仿GTA地图系统
一直觉着GTA的小地图很方便,在地图上的图标能够实时反映出各种任务点.设施等的方位,那么我也仿照它的地图系统做一个简陋的. 还有,提前说一下,这篇文章面向至少用UGUI做过按钮点击事件的读者,因为一些 ...
- M8系统开发手记(2)
M8系统开发手记(2) Wayne Huang 2011年1月2日 0 写在前面的话 继续上一篇的话题,我们这次介绍最小系统的硬件构建.话说,最近的有些事情让我还是比较感慨的.有时候,觉得那些崇高的 ...
- M8系统开发手记(1)
M8系统开发手记(1) Wayne Huang 2010年12月25日 0 写在前面的话 这篇文章将会涉及有关硬件相关的内容,如果要问我为什么会从软件转到硬件,这其中有一个比较悠长的故事. 我想通过 ...
- 我的日记本开发手记——概述
随着计算机技术的普及,我们的生活发生了翻天覆地的变化,好多生活习惯也随之改变,记录生活的方式也在改变.例如,还记得小时候记日记的习惯吗?确切的说,是老师强迫写日记,虽然是被迫写日记,但是随着时间的推移 ...
- 交通银行香港分行实施 Linux 前端系统的开发手记
交通银行香港分行实施 Linux 前端系统的开发手记 2004 年被称为是 Linux 应用推广的开端之年.剖开历史巨大的横断面,诸多的 Linux 应用项目如繁星,开始隐隐出现在巨大的苍穹下.它们中 ...
- Unity 2D独立开发手记(五):通用任务系统
一年多没写博了,因为迫不得已转行,这破游戏也搁置了好久,过完年也有一个月了,回来找找感觉.那就记录一下任务系统的开发吧,方便以后回忆.(2022年3月注:文章中的任务系统太旧了,仅供思路参考,获取新版 ...
- iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据
iOS开发:沙盒机制以及利用沙盒存储字符串.数组.字典等数据 1.初识沙盒:(1).存储在内存中的数据,程序关闭,内存释放,数据就会丢失,这种数据是临时的.要想数据永久保存,将数据保存成文件,存储到程 ...
- 开发可以复用的构件和利用可以复用的构件进行开发
------------ 一个关于构件复用规程的例子 原则 1, 构件是可复用的.供二次开发的软件,主体可以是源代码形式,也可以是二进制形式,配套相应的文档. 2, 各项目使用的构件(包括 ...
最新文章
- P1502 窗口的星星 离散化+扫描线
- python作者叫什么-Python18:什么是字典
- 初学laravel migrate常见错误解决
- Nginx面试中最常见的18道题及答案
- vue 时间刻度_vue时间轴风格式的图片展示
- 计算面平均边_计算机图形学补充2:齐次空间裁剪(Homogeneous Space Clipping)
- Win7系统搜索功能无法使用的应对办法
- 数字滤波器(四)--模拟滤波器转化为数字滤波器
- (clion 安装插件联网络失败,pycharm pip联网失败)当电脑选择拨号上网时,解决系统代理被篡改/pip提示“目标计算机积极拒绝,无法连接”的方法! [ 此方法绝对解决系统代理被篡改问题 ]
- 《剑指offer》面试题30——最小的k 个数
- linux程序内码,windows系统与linux系统的内码转换总结
- Logic Pro X for Mac(专业级音频制作软件)
- 中文拼音排序(web前端实现)
- python网页登录验证码_15.Python实现识别登录验证码(入门)
- deepin显卡驱动管理器在哪_deepin显卡设置
- 如何删除下一页分节符_怎么去掉分节符下一页
- 如何成为一个优秀的测试工程师
- windows php进程数,win10的进程数应该多少?
- 小程序引导用户下载APP
- 可达性分析算法-针对的对象