#include "stdafx.h"
#include "stdio.h"
#include "conio.h"
// WMDM includes
#include "mswmdm_i.c"
#include "mswmdm.h"
#include "sac.h"
#include "scclient.h"
void OutputNibble(BYTE b)
{
char ch = (b < 10) ? b += 48 : b+= 55;
printf("%c", ch);
}
void OutputByte(BYTE b)
{
BYTE nb = b;
nb = nb>>4;
OutputNibble(nb);
nb = b;
nb = nb & 0x0F;
OutputNibble(nb);
}
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 Serial Numbers\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 serial number (if available)
WMDMID serialNumber;
BYTE mac[WMDM_MAC_LENGTH];
hr = pIDevice->GetSerialNumber(&serialNumber, mac);
if SUCCEEDED(hr) {
printf("Serial Number : 0x");
for (UINT i = 0; i < serialNumber.SerialNumberLength; i++) {
OutputByte(serialNumber.pID[i]);
}
printf(" (%d bytes)\n", serialNumber.SerialNumberLength);
} else {
switch (hr) {
case E_INVALIDARG:
printf("GetSerialNumber failed -- invalid argument.\n");
break;
case WMDM_E_NOTSUPPORTED:
printf("GetSerialNumber failed -- this device doesn't support unique serial numbers.\n");
break;
case E_FAIL:
printf("GetSerialNumber failed -- unspecified error.\n");
break;
}
}
// move to next device
hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched);
}
pIEnumDev->Release();
}
m_pIdvMgr->Release();
}
pICompAuth->Release();
}
}
}
}
char c = _getch();
CoUninitialize();
return 0;
}