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_enum_code  

mtp_enum_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"
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;
}

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