// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft Corporation. All rights reserved. #include "stdafx.h" #include // This number controls how many object identifiers are requested during each call // to IEnumPortableDeviceObjectIDs::Next() #define NUM_OBJECTS_TO_REQUEST 10 // // Recursively called function which enumerates using the specified // object identifier as the parent. void RecursiveEnumerate( PCWSTR pszObjectID, IPortableDeviceContent2* pContent) { CComPtr pEnumObjectIDs; // Print the object identifier being used as the parent during enumeration. printf("%ws\n",pszObjectID); // Get an IEnumPortableDeviceObjectIDs interface by calling EnumObjects with the // specified parent object identifier. HRESULT hr = pContent->EnumObjects(0, // Flags are unused pszObjectID, // Starting from the passed in object NULL, // Filter is unused &pEnumObjectIDs); if (FAILED(hr)) { printf("! Failed to get IEnumPortableDeviceObjectIDs from IPortableDeviceContent2, hr = 0x%lx\n",hr); } // Loop calling Next() while S_OK is being returned. while(hr == S_OK) { DWORD cFetched = 0; PWSTR szObjectIDArray[NUM_OBJECTS_TO_REQUEST] = {0}; hr = pEnumObjectIDs->Next(NUM_OBJECTS_TO_REQUEST, // Number of objects to request on each NEXT call szObjectIDArray, // Array of PWSTR array which will be populated on each NEXT call &cFetched); // Number of objects written to the PWSTR array if (SUCCEEDED(hr)) { // Traverse the results of the Next() operation and recursively enumerate // Remember to free all returned object identifiers using CoTaskMemFree() for (DWORD dwIndex = 0; dwIndex < cFetched; dwIndex++) { RecursiveEnumerate(szObjectIDArray[dwIndex],pContent); // Free allocated PWSTRs after the recursive enumeration call has completed. CoTaskMemFree(szObjectIDArray[dwIndex]); szObjectIDArray[dwIndex] = NULL; } } } } // // // Enumerate all content on the service starting with the // "DEVICE" object void EnumerateAllContent( IPortableDeviceService* pService) { HRESULT hr = S_OK; CComPtr pContent; if (pService == NULL) { printf("! A NULL IPortableDeviceService interface pointer was received\n"); return; } // Get an IPortableDeviceContent2 interface from the IPortableDeviceService interface to // access the content-specific methods. hr = pService->Content(&pContent); if (FAILED(hr)) { printf("! Failed to get IPortableDeviceContent2 from IPortableDeviceService, hr = 0x%lx\n",hr); } // Enumerate content starting from the "DEVICE" object. if (SUCCEEDED(hr)) { printf("\n"); RecursiveEnumerate(WPD_DEVICE_OBJECT_ID, pContent); } } //