summaryrefslogtreecommitdiff
path: root/wpd/WpdHelloWorldDriver/Driver.cpp
diff options
context:
space:
mode:
authorDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
committerDave Wilson <[email protected]>2015-03-17 19:50:07 -0700
commit97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch)
tree46f3701832d70b420eb0fc0eb93261f9da45db3f /wpd/WpdHelloWorldDriver/Driver.cpp
parentef1905bf1e8825bb31120dfb27e0daf3154d859a (diff)
Initial publish
Diffstat (limited to 'wpd/WpdHelloWorldDriver/Driver.cpp')
-rw-r--r--wpd/WpdHelloWorldDriver/Driver.cpp192
1 files changed, 192 insertions, 0 deletions
diff --git a/wpd/WpdHelloWorldDriver/Driver.cpp b/wpd/WpdHelloWorldDriver/Driver.cpp
new file mode 100644
index 00000000..12473bf6
--- /dev/null
+++ b/wpd/WpdHelloWorldDriver/Driver.cpp
@@ -0,0 +1,192 @@
+#include "stdafx.h"
+#include "Driver.h"
+#include "Device.h"
+#include "Queue.h"
+
+CDriver::CDriver()
+{
+}
+
+HRESULT
+CDriver::OnDeviceAdd(
+ _In_ IWDFDriver* pDriver,
+ _In_ IWDFDeviceInitialize* pDeviceInit
+ )
+/*++
+
+Routine Description:
+
+ The framework calls this function when a device is being added to
+ the driver stack.
+
+Arguments:
+
+ IWDFDriver - Framework interface. The driver uses this
+ interface to create device objects.
+ IWDFDeviceInitialize - Framework interface. The driver uses this
+ interface to set device parameters before
+ creating the device obeject.
+
+Return Value:
+
+ HRESULT S_OK - Device added successfully
+
+--*/
+{
+ HRESULT hr = S_OK;
+ CComPtr<IUnknown> pDeviceCallback;
+
+ WpdBaseDriver *pWpdBaseDriver = NULL;
+
+ //
+ // Create the WPD driver object that handles all WPD messages for this device
+ //
+ pWpdBaseDriver = new WpdBaseDriver();
+ if(pWpdBaseDriver == NULL)
+ {
+ hr = E_OUTOFMEMORY;
+ }
+
+ if(SUCCEEDED(hr))
+ {
+ //
+ // Create device callback object
+ //
+ hr = CDevice::CreateInstance(pDeviceInit, pWpdBaseDriver, &pDeviceCallback);
+ }
+
+ //
+ // This driver has no special power management requirements and so
+ // we set power policy ownership to UMDF to indicate that UMDF should
+ // handle powermanagement for us.
+ //
+ pDeviceInit->SetPowerPolicyOwnership(FALSE);
+
+ //
+ // Create WDFDevice.
+ //
+ CComPtr<IWDFDevice> pIWDFDevice;
+ if(SUCCEEDED(hr))
+ {
+ hr = pDriver->CreateDevice(
+ pDeviceInit,
+ pDeviceCallback,
+ &pIWDFDevice);
+ }
+
+ //
+ // Assign pWpdBaseDriver to the device object. Each UMDF device requires its own instance of
+ // a WpdBaseDriver to handle WPD messages.
+ //
+ if(SUCCEEDED(hr))
+ {
+ hr = pIWDFDevice->AssignContext(this, (void*)pWpdBaseDriver);
+ if(SUCCEEDED(hr))
+ {
+ // AddRef the WpdBaseDriver object since it is not stored with the
+ // device context.
+ pWpdBaseDriver->AddRef();
+ }
+ }
+
+ //
+ // Create queue callback object
+ //
+ CComPtr<IUnknown> pIUnknown;
+ if(S_OK == hr)
+ {
+ hr = CQueue::CreateInstance(&pIUnknown);
+ }
+
+ //
+ // Configure the default queue.
+ //
+ if(S_OK == hr)
+ {
+ CComPtr<IWDFIoQueue> pDefaultQueue;
+ hr = pIWDFDevice->CreateIoQueue(
+ pIUnknown,
+ TRUE, // bDefaultQueue
+ WdfIoQueueDispatchSequential,
+ TRUE, // bPowerManaged
+ FALSE, // bAllowZeroLengthRequests
+ &pDefaultQueue);
+ }
+
+ pDeviceCallback = NULL;
+ pIWDFDevice = NULL;
+
+ //
+ // It is fine to release the interface on the callback object.
+ // The framework has its own refcount on this object and will
+ // provide an interface when calling into the driver.
+ //
+ pIUnknown = NULL;
+
+ // Release the WpdBaseDriver object. If it was successfully added to the device context,
+ // it was already addref'd above. Releasing it here ensures it will be destroyed if
+ // an error occured and it could not be added to the device context.
+ SAFE_RELEASE(pWpdBaseDriver);
+
+ return hr;
+}
+
+void
+CDriver::OnDeinitialize(
+ _In_ IWDFDriver* pDriver
+ )
+/*++
+
+Routine Description:
+
+ The framework calls this function just before de-initializing itself. All
+ WDF framework resources should be released by driver before returning from this call.
+
+Arguments:
+
+Return Value:
+
+--*/
+{
+ UNREFERENCED_PARAMETER(pDriver);
+ return;
+}
+
+HRESULT
+CDriver::OnInitialize(
+ _In_ IWDFDriver* pDriver
+ )
+/*++
+
+Routine Description:
+
+ The framework calls this function just after loading the driver. The driver can
+ perform any global, device independent intialization in this routine.
+
+Arguments:
+
+Return Value:
+
+--*/
+{
+ UNREFERENCED_PARAMETER(pDriver);
+ return S_OK;
+}
+
+STDMETHODIMP_ (void)
+CDriver::OnCleanup(
+ _In_ IWDFObject* pWdfObject
+ )
+{
+ // Release the base driver object
+ HRESULT hr = S_OK;
+ WpdBaseDriver* pWpdBaseDriver = NULL;
+
+ hr = pWdfObject->RetrieveContext((void**)&pWpdBaseDriver);
+ if((hr == S_OK) && (pWpdBaseDriver != NULL))
+ {
+ pWpdBaseDriver->Release();
+ pWpdBaseDriver = NULL;
+ }
+}
+