#include "stdafx.h" #include "stdio.h" #include "conio.h" // WMDM includes #include "mswmdm_i.c" #include "mswmdm.h" #include "sac.h" #include "scclient.h" int main(int argc, char* argv[]) { HRESULT hr; IComponentAuthenticate* pICompAuth; CSecureChannelClient *m_pSacClient = new CSecureChannelClient; IWMDeviceManager3* m_pIdvMgr = NULL; //these are generic keys BYTE abPVK[] = {0x00}; BYTE abCert[] = {0x00}; printf("MTP Enumeration\n"); printf("===============\n"); CoInitialize(NULL); // get an authentication interface hr = CoCreateInstance(CLSID_MediaDevMgr, NULL, CLSCTX_ALL ,IID_IComponentAuthenticate, (void **)&pICompAuth); if SUCCEEDED(hr) { // create a secure channel client certificate hr = m_pSacClient->SetCertificate(SAC_CERT_V1, (BYTE*) abCert, sizeof(abCert), (BYTE*) abPVK, sizeof(abPVK)); if SUCCEEDED(hr) { // bind the authentication interface to the secure channel client m_pSacClient->SetInterface(pICompAuth); // trigger communication hr = m_pSacClient->Authenticate(SAC_PROTOCOL_V1); if SUCCEEDED(hr) { // get main interface to media device manager hr = pICompAuth->QueryInterface(IID_IWMDeviceManager2, (void**)&m_pIdvMgr); if SUCCEEDED(hr) { // we now have a media device manager interface... printf("Media device interface information:\n\n"); // revision # DWORD tempDW; hr = m_pIdvMgr->GetRevision(&tempDW); if SUCCEEDED(hr) { printf("Revision number %d\n", tempDW); } // device count hr = m_pIdvMgr->GetDeviceCount(&tempDW); if SUCCEEDED(hr) { printf("Device count: %d\n", tempDW); } // enumerate devices... IWMDMEnumDevice *pIEnumDev; wchar_t pwsString[256]; char ch[256]; hr = m_pIdvMgr->EnumDevices2(&pIEnumDev); if SUCCEEDED(hr) { hr = pIEnumDev->Reset(); // Next will now return the first device if SUCCEEDED(hr) { printf(""); IWMDMDevice3* pIDevice; unsigned long ulNumFetched; size_t ret; hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); while (SUCCEEDED(hr) && (hr != S_FALSE)) { // output device name hr = pIDevice->GetName(pwsString, 256); if SUCCEEDED(hr) { wcstombs_s(&ret, ch, 256, pwsString,_TRUNCATE); printf("Found device %s\n", ch); } // output device manufacturer hr = pIDevice->GetManufacturer(pwsString, 256); if SUCCEEDED(hr) { wcstombs_s(&ret, ch, 256, pwsString,_TRUNCATE); printf(" Device Manufacturer: %s\n", ch); } // output device type hr = pIDevice->GetType(&tempDW); if SUCCEEDED(hr) { printf(" Device supports the following attributes:\n"); if (tempDW & WMDM_DEVICE_TYPE_PLAYBACK) { printf(" WMDM_DEVICE_TYPE_PLAYBACK\n"); } if (tempDW & WMDM_DEVICE_TYPE_RECORD) { printf(" WMDM_DEVICE_TYPE_RECORD\n"); } if (tempDW & WMDM_DEVICE_TYPE_DECODE) { printf(" WMDM_DEVICE_TYPE_DECODE\n"); } if (tempDW & WMDM_DEVICE_TYPE_ENCODE) { printf(" WMDM_DEVICE_TYPE_ENCODE\n"); } if (tempDW & WMDM_DEVICE_TYPE_STORAGE) { printf(" WMDM_DEVICE_TYPE_STORAGE\n"); } if (tempDW & WMDM_DEVICE_TYPE_VIRTUAL) { printf(" WMDM_DEVICE_TYPE_VIRTUAL\n"); } if (tempDW & WMDM_DEVICE_TYPE_SDMI) { printf(" WMDM_DEVICE_TYPE_SDMI\n"); } if (tempDW & WMDM_DEVICE_TYPE_NONSDMI) { printf(" WMDM_DEVICE_TYPE_NONSDMI\n"); } if (tempDW & WMDM_DEVICE_TYPE_NONREENTRANT) { printf(" WMDM_DEVICE_TYPE_NONREENTRANT\n"); } if (tempDW & WMDM_DEVICE_TYPE_FILELISTRESYNC) { printf(" WMDM_DEVICE_TYPE_FILELISTRESYNC\n"); } if (tempDW & WMDM_DEVICE_TYPE_VIEW_PREF_METADATAVIEW) { printf(" WMDM_DEVICE_TYPE_VIEW_PREF_METADATAVIEW\n"); } } if (tempDW & WMDM_DEVICE_TYPE_STORAGE) { // get storage information IWMDMEnumStorage *pIEnumStorage = NULL; IWMDMEnumStorage *pIEnumFileStorage = NULL; IWMDMEnumStorage *pIEnumFileStorageL2 = NULL; IWMDMStorage *pIStorage = NULL; IWMDMStorage3 *pIFileStorage = NULL; IWMDMStorage3 *pIFileStorage_L2 = NULL; _WAVEFORMATEX format; hr = pIDevice->EnumStorage(&pIEnumStorage); if SUCCEEDED(hr) { pIEnumStorage->Reset(); hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); while (SUCCEEDED(hr) && (hr != S_FALSE)) { pIStorage->GetName(pwsString, 256); if SUCCEEDED(hr) { wcstombs_s(&ret, ch, 256, pwsString,_TRUNCATE); printf(" Storage Name: %s\n", ch); } printf(" Storage attributes:\n"); pIStorage->GetAttributes(&tempDW, &format); if (tempDW & WMDM_STORAGE_ATTR_FILESYSTEM) { printf(" FILESYSTEM\n"); } if (tempDW & WMDM_STORAGE_ATTR_REMOVABLE) { printf(" REMOVABLE\n"); } if (tempDW & WMDM_STORAGE_ATTR_FOLDERS) { printf(" FOLDERS\n"); } if (tempDW & WMDM_STORAGE_ATTR_HAS_FILES) { printf(" HAS_FILES\n"); } if (tempDW & WMDM_STORAGE_ATTR_HAS_FOLDERS) { printf(" HAS_FOLDERS\n"); } if (tempDW & WMDM_STORAGE_ATTR_CANEDITMETADATA) { printf(" CANEDITMETADATA\n"); } if (tempDW & WMDM_STORAGE_ATTR_VIRTUAL) { printf(" VIRTUAL\n"); } if (tempDW & WMDM_STORAGE_IS_DEFAULT) { printf(" IS_DEFAULT\n"); } if (tempDW & WMDM_STORAGE_CONTAINS_DEFAULT) { printf(" CONTAINS_DEFAULT\n"); } hr = pIStorage->EnumStorage(&pIEnumFileStorage); if SUCCEEDED(hr) { printf(" Files:\n"); pIEnumFileStorage->Reset(); hr = pIEnumFileStorage->Next(1, (IWMDMStorage **)&pIFileStorage, &ulNumFetched); while (SUCCEEDED(hr) && hr != S_FALSE) { hr = pIFileStorage->GetName(pwsString, 256); if SUCCEEDED(hr) { wcstombs_s(&ret, ch, 256, pwsString,_TRUNCATE); printf(" %s", ch); } hr = pIFileStorage->GetAttributes(&tempDW, &format); if SUCCEEDED(hr) { if (tempDW & WMDM_FILE_ATTR_FOLDER) { printf("/\n"); hr = pIFileStorage->EnumStorage(&pIEnumFileStorageL2); if SUCCEEDED(hr) { pIEnumFileStorageL2->Reset(); hr = pIEnumFileStorageL2->Next(1, (IWMDMStorage **)&pIFileStorage_L2, &ulNumFetched); while (SUCCEEDED(hr) && (hr != S_FALSE)) { hr = pIFileStorage_L2->GetName(pwsString, 256); if SUCCEEDED(hr) { wcstombs_s(&ret, ch, 256, pwsString,_TRUNCATE); hr = pIFileStorage_L2->GetAttributes(&tempDW, &format); if SUCCEEDED(hr) { if (tempDW & WMDM_FILE_ATTR_FOLDER) { // don't print out secondary folders... } else { printf(" %s", ch); if (tempDW & WMDM_FILE_ATTR_FILE) { printf(", FILE"); } if (tempDW & WMDM_FILE_ATTR_FOLDER) { printf(", FOLDER"); } if (tempDW & WMDM_FILE_ATTR_LINK) { printf(", LINK"); } if (tempDW & WMDM_FILE_ATTR_AUDIO) { printf(", AUDIO"); } if (tempDW & WMDM_FILE_ATTR_DATA) { printf(", DATA"); } if (tempDW & WMDM_FILE_ATTR_CANPLAY) { printf(", CANPLAY"); } if (tempDW & WMDM_FILE_ATTR_CANDELETE) { printf(", CANDELETE"); } if (tempDW & WMDM_FILE_ATTR_CANREAD) { printf(", CANREAD"); } if (tempDW & WMDM_FILE_ATTR_MUSIC) { printf(", MUSIC"); } if (tempDW & WMDM_FILE_ATTR_AUDIOBOOK) { printf(", AUDIOBOOK"); } if (tempDW & WMDM_FILE_ATTR_VIDEO) { printf(", VIDEO"); } if (tempDW & WMDM_FILE_ATTR_HIDDEN) { printf(", HIDDEN"); } if (tempDW & WMDM_FILE_ATTR_SYSTEM) { printf(", SYSTEM"); } if (tempDW & WMDM_FILE_ATTR_READONLY) { printf(", READONLY"); } printf("\n"); } } else { printf("\n"); } } hr = pIEnumFileStorageL2->Next(1, (IWMDMStorage **)&pIFileStorage_L2, &ulNumFetched); } pIEnumFileStorageL2->Release(); } } else { printf("\n"); } } else { printf("\n"); } pIFileStorage->Release(); hr = pIEnumFileStorage->Next(1, (IWMDMStorage **)&pIFileStorage, &ulNumFetched); } pIEnumFileStorage->Release(); } hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); } pIEnumStorage->Release(); } } // move to next device hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); } pIEnumDev->Release(); } m_pIdvMgr->Release(); } pICompAuth->Release(); } } } } char c = _getch(); CoUninitialize(); return 0; }