Skip to main content

Open Source

Go Search
Home
ALchemy
Beta - Audigy [CLOSED]
Beta - Linux
Beta - Windows
Developer
E-MU
MarCom
OpenAL
Open Source
  
Creative Labs: Connect > Open Source > Wiki > mtp_serial_code  

mtp_serial_code

#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;
}

Last modified at 12/5/2007 2:37 PM  by Phillip Williams