summaryrefslogtreecommitdiff
path: root/general/echo/umdfSocketEcho/Driver/device.cpp
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2023-02-03 14:36:05 -0800
committerAdonais Romero González <[email protected]>2023-02-03 14:36:05 -0800
commitc0174c77c5dbed96d4e537c08b1504cd6b9a3134 (patch)
tree36dbbe54aee9cd4f381975a5d0c6eea75bfb956f /general/echo/umdfSocketEcho/Driver/device.cpp
parent520c37087776a198544ab9b721d802dd30864736 (diff)
parent07779ee84973f2f63a1f2ced6377463b1c01baaf (diff)
Merge branch 'main' into develop-2302-merge
Diffstat (limited to 'general/echo/umdfSocketEcho/Driver/device.cpp')
-rw-r--r--general/echo/umdfSocketEcho/Driver/device.cpp469
1 files changed, 0 insertions, 469 deletions
diff --git a/general/echo/umdfSocketEcho/Driver/device.cpp b/general/echo/umdfSocketEcho/Driver/device.cpp
deleted file mode 100644
index 9c3e4db1..00000000
--- a/general/echo/umdfSocketEcho/Driver/device.cpp
+++ /dev/null
@@ -1,469 +0,0 @@
-/*++
-
-Copyright (C) Microsoft Corporation, All Rights Reserved.
-
-Module Name:
-
- Device.cpp
-
-Abstract:
-
- This module contains the implementation of the UMDF socketecho sample
- driver's device callback object.
-
- It does not implement either of the PNP interfaces so once the device
- is setup, it won't ever get any callbacks until the device is removed.
-
-Environment:
-
- Windows User-Mode Driver Framework (WUDF)
-
---*/
-
-#include "internal.h"
-#include "device.tmh"
-
-const GUID GUID_DEVINTERFACE_SOCKETECHO =
- {0xcdc35b6e, 0xbe4, 0x4936, { 0xbf, 0x5f, 0x55, 0x37, 0x38, 0xa, 0x7c, 0x1a }};
-
-
-HRESULT
-CMyDevice::Initialize(
- _In_ IWDFDriver* FxDriver,
- _In_ IWDFDeviceInitialize* FxDeviceInit
- )
-/*++
-
- Routine Description:
-
- This method initializes the device callback object and creates the
- partner device object.
-
- The method should perform any device-specific configuration that:
- * could fail (these can't be done in the constructor)
- * must be done before the partner object is created -or-
- * can be done after the partner object is created and which aren't
- influenced by any device-level parameters the parent (the driver
- in this case) might set.
-
- Arguments:
-
- FxDeviceInit - the settings for this device.
- FxDriver - IWDF Driver for this device.
-
- Return Value:
-
- status.
-
---*/
-{
- Trace(TRACE_LEVEL_INFORMATION, "%!FUNC!");
-
- CComPtr<IWDFDevice> fxDevice;
- HRESULT hr;
- BOOL bFilter = FALSE;
-
- //
- // Configure things like the locking model before we go to create our
- // partner device.
- //
-
- //
- // Set the locking model
- //
-
- FxDeviceInit->SetLockingConstraint(None);
-
- //
- // Mark filter if we are a filter
- //
-
- if (bFilter)
- {
- FxDeviceInit->SetFilter();
- }
-
- //
- // TODO: Any per-device initialization which must be done before
- // creating the partner object.
- //
-
- //
- // Create a new FX device object and assign the new callback object to
- // handle any device level events that occur.
- //
-
- //
- // QueryIUnknown references the IUnknown interface that it returns
- // (which is the same as referencing the device). We pass that to
- // CreateDevice, which takes its own reference if everything works.
- //
-
- CComPtr<IUnknown> pUnk;
- HRESULT hrQI = this->QueryInterface(__uuidof(IUnknown),(void**)&pUnk);
- WUDF_SAMPLE_DRIVER_ASSERT(SUCCEEDED(hrQI));
-
- hr = FxDriver->CreateDevice(FxDeviceInit, pUnk, &fxDevice);
-
- //
- // If that succeeded then set our FxDevice member variable.
- //
-
- if (SUCCEEDED(hr))
- {
- m_FxDevice = fxDevice;
- }
-
- return hr;
-}
-
-HRESULT
-CMyDevice::Configure(
- VOID
- )
-/*++
-
- Routine Description:
-
- This method is called after the device callback object has been initialized
- and returned to the driver. It would setup the device's queues and their
- corresponding callback objects.
-
- Arguments:
-
- None
-
- Return Value:
-
- status
-
---*/
-{
- Trace(TRACE_LEVEL_INFORMATION, "%!FUNC!");
-
- HRESULT hr;
- CComObject<CMyQueue> * defaultQueue = NULL;
-
- //
- // Create a new instance of our queue callback object
- //
- hr = CComObject<CMyQueue>::CreateInstance(&defaultQueue);
-
- if (SUCCEEDED(hr))
- {
- defaultQueue->AddRef();
- hr = defaultQueue->Initialize(this);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = defaultQueue->Configure();
- }
-
- //
- // Create and Enable Device Interface for this device.
- //
- if (SUCCEEDED(hr))
- {
- hr = m_FxDevice->CreateDeviceInterface(&GUID_DEVINTERFACE_SOCKETECHO,
- NULL);
- }
- if (SUCCEEDED(hr))
- {
- hr = m_FxDevice->AssignDeviceInterfaceState(&GUID_DEVINTERFACE_SOCKETECHO,
- NULL,
- TRUE);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = ReadAndAssignPropertyStoreValue();
- }
-
- //
- // Release the reference we took on the queue callback object.
- // The framework took its own references on the object's callback interfaces
- // when we called m_FxDevice->CreateIoQueue, and will manage the object's lifetime.
- //
- SAFE_RELEASE(defaultQueue);
-
- return hr;
-}
-
-STDMETHODIMP_(void)
-CMyDevice::OnCloseFile(
- _In_ IWDFFile* pWdfFileObject
- )
-/*++
-
- Routine Description:
-
- This method is called when an app closes the file handle to this device.
- This will free the context memory associated with this file object, close
- the connection object associated with this file object and delete the file
- handle i/o target object associated with this file object.
-
- Arguments:
-
- pWdfFileObject - the framework file object for which close is handled.
-
- Return Value:
-
- None
-
---*/
-{
- Trace(TRACE_LEVEL_INFORMATION, "%!FUNC!");
-
- HRESULT hr = S_OK ;
- FileContext *pContext = NULL;
-
- hr = pWdfFileObject->RetrieveContext((void**)&pContext);
-
- if (SUCCEEDED(hr) && (pContext != NULL ) )
- {
- pContext->pConnection->Close();
- pContext->pFileTarget->DeleteWdfObject();
-
- delete pContext->pConnection;
- delete pContext;
- }
-
- return ;
-}
-
-
-STDMETHODIMP_(void)
-CMyDevice::OnCleanupFile(
- _In_ IWDFFile* pWdfFileObject
- )
-/*++
-
- Routine Description:
-
- This method is when app with open handle device terminates.
-
- Arguments:
-
- pWdfFileObject - the framework file object for which close is handled.
-
- Return Value:
-
- None
-
---*/
-{
- UNREFERENCED_PARAMETER(pWdfFileObject);
-}
-
-STDMETHODIMP_(void)
-CMyDevice::OnCleanup(
- _In_ IWDFObject* pWdfObject
- )
-/*++
-
- Routine Description:
-
- This device callback method is invoked by the framework when the WdfObject
- is about to be released by the framework. This will free the context memory
- associated with the device object.
-
- Arguments:
-
- pWdfObject - the framework device object for which OnCleanup.
-
- Return Value:
-
- None
-
---*/
-{
- Trace(TRACE_LEVEL_INFORMATION, "%!FUNC!");
-
- HRESULT hr ;
- DeviceContext *pContext = NULL;
-
- WUDF_SAMPLE_DRIVER_ASSERT(pWdfObject == m_FxDevice);
-
- hr = pWdfObject->RetrieveContext((void**)&pContext);
-
- if (SUCCEEDED(hr) && (pContext != NULL))
- {
- // hostStr is allocated through StrDup, and thus need be freed through LocalFree
- //
- if (pContext->hostStr != NULL)
- {
- LocalFree( pContext->hostStr );
- }
-
- if (pContext->portStr != NULL)
- {
- LocalFree( pContext->portStr );
- }
-
- delete pContext;
- }
-//
-//CMyDevice has a reference to framework device object via m_Device.
-//Framework device object has a reference to CMyDevice object via the callbacks.
-//This leads to circular reference and both the objects can't be destroyed until this circular reference is broken.
-//To break the circular reference we release the reference to the framework device object here in OnCleanup.
-
- m_FxDevice = NULL;
-}
-
-HRESULT
-CMyDevice::ReadAndAssignPropertyStoreValue(
- VOID
- )
-/*++
-
- Routine Description:
- Helper function for reading property store values and storing them in the
- device level context.
-
- Arguments:
-
- pWdfFileObject - the framework file object for which close is handled.
-
- Return Value:
-
- None
-
---*/
-{
- Trace(TRACE_LEVEL_INFORMATION, "%!FUNC!");
-
- CComPtr<IWDFNamedPropertyStore> pPropStore;
- WDF_PROPERTY_STORE_DISPOSITION disposition;
- PROPVARIANT val;
- HRESULT hr ;
-
- PropVariantInit(&val);
-
- DeviceContext *pContext = new DeviceContext;
- if (pContext == NULL)
- {
- hr = E_OUTOFMEMORY;
- Trace(TRACE_LEVEL_ERROR,
- L"ERROR: Could not create device context object %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- pContext->hostStr = NULL;
- pContext->portStr = NULL;
-
- //
- // Retreive property store for reading drivers custom settings as specified
- // in the INF
- //
- hr = m_FxDevice->RetrieveDevicePropertyStore(L"SocketEcho",
- WdfPropertyStoreNormal,
- &pPropStore,
- &disposition);
- if (FAILED(hr))
- {
- Trace(TRACE_LEVEL_ERROR,
- "Failed to retrieve device property store for reading custom "
- "settings as specified in the INF %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- //
- // Get the key for this device with Named value "host"
- //
- hr = pPropStore->GetNamedValue(L"Host", &val);
- if (FAILED(hr))
- {
- Trace(TRACE_LEVEL_ERROR,
- "Failed to get \"Host\" key value %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- if (val.vt != VT_LPWSTR)
- {
- hr = HRESULT_FROM_WIN32(ERROR_BAD_CONFIGURATION);
- Trace(TRACE_LEVEL_ERROR,
- "Unexpected string format for value in \"Host\" key %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- pContext->hostStr = StrDup(val.pwszVal);
-
- //
- // Clear property variant for reading next key
- //
- PropVariantClear(&val);
-
- //
- // Get the key for this device with Named value "Port"
- //
- hr = pPropStore->GetNamedValue(L"Port", &val);
- if (FAILED(hr))
- {
- Trace(TRACE_LEVEL_ERROR,
- "Failed to get \"Port\" key value %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- if (val.vt != VT_LPWSTR)
- {
- hr = HRESULT_FROM_WIN32(ERROR_BAD_CONFIGURATION);
- Trace(TRACE_LEVEL_ERROR,
- "Unexpected string format for value in \"Port\" key %!hresult!",
- hr);
-
- goto CleanUp;
- }
-
- pContext->portStr = StrDup(val.pwszVal);
-
- hr = m_FxDevice->AssignContext(NULL, (void*)pContext);
- if (FAILED(hr))
- {
- Trace(TRACE_LEVEL_ERROR,
- "Failed to assign property store value to device %!hresult!",
- hr);
-
- //
- // Fall through to clean up and exit ...
- //
- }
-
-CleanUp:
-
- PropVariantClear(&val);
-
- if (FAILED(hr))
- {
- if (pContext != NULL)
- {
- // hostStr is allocated through StrDup, and thus need be freed through LocalFree
- //
- if (pContext->hostStr != NULL)
- {
- LocalFree( pContext->hostStr );
- }
-
- if (pContext->portStr != NULL)
- {
- LocalFree( pContext->portStr );
- }
-
- delete pContext;
- }
- }
-
- return hr;
-}
-