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 原理, 对照接口偏移量, 逆向出源代码相关推荐

  1. AppNinja 开发手记4: dmg kernelcache解密命令

    AppNinja 开发手记4: dmg kernelcache解密命令 学习心得: http://theiphonewiki.com Written by AppNinja 开发手记 rem vfde ...

  2. Unity 2D独立开发手记(九):UGUI仿GTA地图系统

    一直觉着GTA的小地图很方便,在地图上的图标能够实时反映出各种任务点.设施等的方位,那么我也仿照它的地图系统做一个简陋的. 还有,提前说一下,这篇文章面向至少用UGUI做过按钮点击事件的读者,因为一些 ...

  3. M8系统开发手记(2)

    M8系统开发手记(2) Wayne Huang 2011年1月2日 0  写在前面的话 继续上一篇的话题,我们这次介绍最小系统的硬件构建.话说,最近的有些事情让我还是比较感慨的.有时候,觉得那些崇高的 ...

  4. M8系统开发手记(1)

    M8系统开发手记(1) Wayne Huang 2010年12月25日 0  写在前面的话 这篇文章将会涉及有关硬件相关的内容,如果要问我为什么会从软件转到硬件,这其中有一个比较悠长的故事. 我想通过 ...

  5. 我的日记本开发手记——概述

    随着计算机技术的普及,我们的生活发生了翻天覆地的变化,好多生活习惯也随之改变,记录生活的方式也在改变.例如,还记得小时候记日记的习惯吗?确切的说,是老师强迫写日记,虽然是被迫写日记,但是随着时间的推移 ...

  6. 交通银行香港分行实施 Linux 前端系统的开发手记

    交通银行香港分行实施 Linux 前端系统的开发手记 2004 年被称为是 Linux 应用推广的开端之年.剖开历史巨大的横断面,诸多的 Linux 应用项目如繁星,开始隐隐出现在巨大的苍穹下.它们中 ...

  7. Unity 2D独立开发手记(五):通用任务系统

    一年多没写博了,因为迫不得已转行,这破游戏也搁置了好久,过完年也有一个月了,回来找找感觉.那就记录一下任务系统的开发吧,方便以后回忆.(2022年3月注:文章中的任务系统太旧了,仅供思路参考,获取新版 ...

  8. iOS开发:沙盒机制以及利用沙盒存储字符串、数组、字典等数据

    iOS开发:沙盒机制以及利用沙盒存储字符串.数组.字典等数据 1.初识沙盒:(1).存储在内存中的数据,程序关闭,内存释放,数据就会丢失,这种数据是临时的.要想数据永久保存,将数据保存成文件,存储到程 ...

  9. 开发可以复用的构件和利用可以复用的构件进行开发

    ------------ 一个关于构件复用规程的例子 原则 1,    构件是可复用的.供二次开发的软件,主体可以是源代码形式,也可以是二进制形式,配套相应的文档. 2,    各项目使用的构件(包括 ...

最新文章

  1. P1502 窗口的星星 离散化+扫描线
  2. python作者叫什么-Python18:什么是字典
  3. 初学laravel migrate常见错误解决
  4. Nginx面试中最常见的18道题及答案
  5. vue 时间刻度_vue时间轴风格式的图片展示
  6. 计算面平均边_计算机图形学补充2:齐次空间裁剪(Homogeneous Space Clipping)
  7. Win7系统搜索功能无法使用的应对办法
  8. 数字滤波器(四)--模拟滤波器转化为数字滤波器
  9. (clion 安装插件联网络失败,pycharm pip联网失败)当电脑选择拨号上网时,解决系统代理被篡改/pip提示“目标计算机积极拒绝,无法连接”的方法! [ 此方法绝对解决系统代理被篡改问题 ]
  10. 《剑指offer》面试题30——最小的k 个数
  11. linux程序内码,windows系统与linux系统的内码转换总结
  12. Logic Pro X for Mac(专业级音频制作软件)
  13. 中文拼音排序(web前端实现)
  14. python网页登录验证码_15.Python实现识别登录验证码(入门)
  15. deepin显卡驱动管理器在哪_deepin显卡设置
  16. 如何删除下一页分节符_怎么去掉分节符下一页
  17. 如何成为一个优秀的测试工程师
  18. windows php进程数,win10的进程数应该多少?
  19. 小程序引导用户下载APP
  20. 可达性分析算法-针对的对象

热门文章

  1. IOS 开发中用到的数学函数
  2. 点石互动--石头之用户搜索行为与关键词分析(一):用户的搜索行为对于关键词分析的意义及趋势
  3. 来来来,探究一下CommonJs的实现原理
  4. txt文本字数统计和出现字数的排序(西游记.txt)
  5. C#中的索引器(Indexers)
  6. visio画图旋转任意角度,不保留白边保存pdf格式
  7. Jinja2文档学习
  8. CSS Day-12
  9. Announcing the program for the 2018 LLVM Developers’ Meeting Bay Area
  10. Transactional