/** * This method is called when we receive a WPD_COMMAND_OBJECT_RESOURCES_CLOSE * command. * * The parameters sent to us are: * - WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT: the context the driver returned to * the client in OnOpenResource. * * The driver should: * - Destroy any data associated with this context. */ HRESULT WpdObjectResources::OnCloseResource( _In_ IPortableDeviceValues* pParams, _In_ IPortableDeviceValues* pResults) { HRESULT hr = S_OK; LPWSTR wszResourceContext = NULL; ContextMap* pContextMap = NULL; UNREFERENCED_PARAMETER(pResults); // First get ALL parameters for this command. If we cannot get ALL parameters // then E_INVALIDARG should be returned and no further processing should occur. // Get the resource context identifier for this resource operation. We will // need this to lookup the specific resource context in the client context map. hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT, &wszResourceContext); if (hr != S_OK) { hr = E_INVALIDARG; CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT"); } // Get the client context map so we can retrieve the resource context for this resource // operation using the WPD_PROPERTY_OBJECT_RESOURCES_CONTEXT property value obtained above. if (hr == S_OK) { hr = pParams->GetIUnknownValue(PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP, (IUnknown**)&pContextMap); CHECK_HR(hr, "Failed to get PRIVATE_SAMPLE_DRIVER_CLIENT_CONTEXT_MAP"); } // Destroy any data allocated/associated with the resource context and then remove it from the context map. // We no longer need to keep this context around because the resource operation has been ended. if (hr == S_OK) { pContextMap->Remove(wszResourceContext); } // Free the memory. CoTaskMemFree ignores NULLs so no need to check. CoTaskMemFree(wszResourceContext); SAFE_RELEASE(pContextMap); return hr; }
/** * This method is called when we receive a WPD_COMMAND_OBJECT_ENUMERATION_END_FIND * command. * * The parameters sent to us are: * - WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT: the context the driver returned to * the client in OnStartFind. * * The driver should: * - Destroy any data associated with this context. */ HRESULT WpdObjectEnumerator::OnEndFind( _In_ IPortableDeviceValues* pParams, _Inout_ IPortableDeviceValues* pResults) { HRESULT hr = S_OK; LPWSTR wszEnumContext = NULL; ContextMap* pContextMap = NULL; UNREFERENCED_PARAMETER(pResults); // First get ALL parameters for this command. If we cannot get ALL parameters // then E_INVALIDARG should be returned and no further processing should occur. // Get the enumeration context identifier for this enumeration operation. We will // need this to lookup the specific enumeration context in the client context map. hr = pParams->GetStringValue(WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT, &wszEnumContext); if (hr != S_OK) { hr = E_INVALIDARG; CHECK_HR(hr, "Missing value for WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT"); } // Get the client context map so we can retrieve the enumeration context for this enumeration // operation using the WPD_PROPERTY_OBJECT_ENUMERATION_CONTEXT property value obtained above. if (hr == S_OK) { hr = GetClientContextMap(pParams, &pContextMap); CHECK_HR(hr, "Failed to get the client context map"); } // Destroy any data allocated/associated with the enumeration context and then remove it from the context map. // We no longer need to keep this context around because the enumeration has been ended. if (hr == S_OK) { pContextMap->Remove(wszEnumContext); } // Free the memory. CoTaskMemFree ignores NULLs so no need to check. CoTaskMemFree(wszEnumContext); SAFE_RELEASE(pContextMap); return hr; }