Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Managing Asynchronous Operations

[Beginning with Windows 8 and Windows Server 2012, the Virtual Disk Service is superseded by the Windows Storage Management API.]

The code example that follows demonstrates how a caller works with an async object. Here, the SynchronousCreateLun function calls the asynchronous IVdsSubSystem::CreateLun method using the given parameters. The function will wait on the async object for the asynchronous CreateLun method call to finish. When the IVdsAsync::Wait method returns, SynchronousCreateLun gets the IVdsLun interface for the newly created LUN and returns it as an out argument.

//
// Simple macro to release non-null interfaces.
//
#include <windows.h>
#include "vds.h"
#include <stdio.h>

#define _SafeRelease(x) {if (NULL != x) { x->Release(); x = NULL; } }

HRESULT SynchronousCreateLun(
 IVdsSubSystem *pSubsystem,
 VDS_LUN_TYPE type,
 ULONGLONG ullSize,
 VDS_OBJECT_ID *pDriveIdArray,
 LONG lNumberOfDrives,
 LPWSTR pwszUnmaskingList,
 VDS_HINTS *pHints,
 IVdsLun **ppLun)
{
 HRESULT hResult = S_OK;
 HRESULT hResult2 = S_OK;
 IVdsAsync *pAsync = NULL;
 VDS_ASYNC_OUTPUT AsyncOut;
 IUnknown* pUnknown = NULL;

 ZeroMemory( &AsyncOut, sizeof(VDS_ASYNC_OUTPUT));

 hResult = pSubsystem->CreateLun(
 type,
 ullSize,
 pDriveIdArray,
 lNumberOfDrives,
 pwszUnmaskingList,
 pHints,
 &pAsync);

 if (SUCCEEDED(hResult) && (!pAsync)) {
 hResult = E_UNEXPECTED; // Errant provider, returned S_OK 
 // with a NULL pointer.
 }

 if (SUCCEEDED(hResult)) {
 // Wait until the Async is done.
 hResult2 = pAsync->Wait( &hResult, &AsyncOut);
 if (SUCCEEDED(hResult) && FAILED(hResult2)) {
 hResult = hResult2;
 }
 }

 if (SUCCEEDED(hResult) && (VDS_ASYNCOUT_CREATELUN != AsyncOut.type)) {
 hResult = E_UNEXPECTED; // Errant provider, returned S_OK 
 // with an unexpected type.
 }

 if (SUCCEEDED(hResult)) {
 pUnknown = AsyncOut.cl.pLunUnk;
 if (!pUnknown) {
 hResult = E_UNEXPECTED; // Errant provider, returned 
 // S_OK with a NULL pointer.
 }
 }

 if (SUCCEEDED(hResult)) {
 hResult = pUnknown->QueryInterface(IID_IVdsLun, (void **)ppLun);
 }

 _SafeRelease(pAsync);
 _SafeRelease(pUnknown);

 return hResult;
}

Related topics

Using VDS

Helper Objects

IVdsSubSystem::CreateLun

IVdsAsync::Wait

IVdsLun


Feedback

Was this page helpful?

Additional resources