#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 Transfer\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... // 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); } // get storage info DWORD tempDW; pIDevice->GetType(&tempDW); if (tempDW & WMDM_DEVICE_TYPE_STORAGE) { 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)) { hr = pIStorage->EnumStorage(&pIEnumFileStorage); if SUCCEEDED(hr) { pIEnumFileStorage->Reset(); hr = pIEnumFileStorage->Next(1, (IWMDMStorage **)&pIFileStorage, &ulNumFetched); while (SUCCEEDED(hr) && hr != S_FALSE) { hr = pIFileStorage->GetName(pwsString, 256); hr = pIFileStorage->GetAttributes(&tempDW, &format); if SUCCEEDED(hr) { if (tempDW & WMDM_FILE_ATTR_FOLDER) { if (wcscmp(pwsString, L"Music") == 0) { IWMDMStorage3 *pNewStorage; hr = pIFileStorage->QueryInterface(IID_IWMDMStorage3, (void **)&pNewStorage); if SUCCEEDED(hr) { IWMDMStorageControl3 *pIWMDMStorageControl; hr = pNewStorage->QueryInterface(IID_IWMDMStorageControl3, (void**)&pIWMDMStorageControl); if SUCCEEDED(hr) { IWMDMMetaData *pIWMDMMetaData = NULL; hr = pNewStorage->CreateEmptyMetadataObject(&pIWMDMMetaData); if (SUCCEEDED(hr)) { DWORD dw = WMDM_FORMATCODE_MP3; hr = pIWMDMMetaData->AddItem(WMDM_TYPE_DWORD, g_wszWMDMFormatCode, (BYTE *)&dw, sizeof(dw)); hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMTitle, (BYTE *)L"TSOS-05-23-2006", 32); hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMAlbumTitle, (BYTE *)L"www.skinnyonsports.com", 46); hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMAuthor, (BYTE *)L"The Skinny on Sports", 42); hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMGenre, (BYTE *)L"Podcast", 16); hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMYear, (BYTE *)L"2006", 10); dw = 0; hr = pIWMDMMetaData->AddItem(WMDM_TYPE_DWORD, g_wszWMDMTrack, (BYTE *)&dw, sizeof(dw)); DWORD ow[2]; ow[0] = 0x77825f00; ow[1] = 1; hr = pIWMDMMetaData->AddItem(WMDM_TYPE_QWORD, g_wszWMDMDuration, (BYTE *)ow, 2 * sizeof(dw)); ow[0] = 0x7532e5; ow[1] = 0; hr = pIWMDMMetaData->AddItem(WMDM_TYPE_QWORD, g_wszWMDMFileSize, (BYTE *)ow, 2 * sizeof(dw)); if (SUCCEEDED(hr)) { IWMDMStorage *pNewObject = NULL; hr = pIWMDMStorageControl->Insert3( WMDM_MODE_BLOCK | WMDM_CONTENT_FILE, 0, L"C:\\Music\\testfile.mp3", NULL, NULL, NULL, pIWMDMMetaData, NULL, (IWMDMStorage **)&pNewObject); if SUCCEEDED(hr) wprintf(L"Insert Succeeded\n"); } } } } } } 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; }