summaryrefslogtreecommitdiff
path: root/general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c
diff options
context:
space:
mode:
authorAdonais Romero González <[email protected]>2019-01-09 15:40:48 -0800
committerGitHub <[email protected]>2019-01-09 15:40:48 -0800
commit0e4c634898f02a512046957bf92adb49f03dd02c (patch)
treec733905bcf562e27a7245b6799317eae3f01e582 /general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c
parent693d7cc6da06e374a0931123f0b5d8c29c945b97 (diff)
parent94f38da770fd3c00e4ee62c983d92c769c80c6c9 (diff)
Merge pull request #326 from BenPYeh/custom_media_source
Custom media source
Diffstat (limited to 'general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c')
-rw-r--r--general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c109
1 files changed, 109 insertions, 0 deletions
diff --git a/general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c b/general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c
new file mode 100644
index 00000000..083cf3c7
--- /dev/null
+++ b/general/SimpleMediaSource/SimpleMediaSourceDriver/Device.c
@@ -0,0 +1,109 @@
+/*++
+
+Module Name:
+
+ device.c - Device handling events for example driver.
+
+Abstract:
+
+ This file contains the device entry points and callbacks.
+
+Environment:
+
+ User-mode Driver Framework 2
+
+--*/
+
+#include "driver.h"
+#include "device.tmh"
+
+GUID CAMERA_CATEGORY = { STATIC_KSCATEGORY_VIDEO_CAMERA };
+GUID CAPTURE_CATEGORY = { STATIC_KSCATEGORY_CAPTURE };
+GUID VIDEO_CATEGORY = { STATIC_KSCATEGORY_VIDEO };
+
+NTSTATUS
+SimpleMediaSourceDriverCreateDevice(
+ _Inout_ PWDFDEVICE_INIT DeviceInit
+ )
+/*++
+
+Routine Description:
+
+ Worker routine called to create a device and its software resources.
+
+Arguments:
+
+ DeviceInit - Pointer to an opaque init structure. Memory for this
+ structure will be freed by the framework when the WdfDeviceCreate
+ succeeds. So don't access the structure after that point.
+
+Return Value:
+
+ NTSTATUS
+
+--*/
+{
+ WDF_OBJECT_ATTRIBUTES deviceAttributes;
+ PDEVICE_CONTEXT deviceContext;
+ WDFDEVICE device;
+ NTSTATUS status;
+ UNICODE_STRING szReference;
+ RtlInitUnicodeString(&szReference, L"CustomCameraSource"); // Needs to match the ReferenceString in INF
+
+ WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, DEVICE_CONTEXT);
+
+ status = WdfDeviceCreate(&DeviceInit, &deviceAttributes, &device);
+
+ if (NT_SUCCESS(status)) {
+ //
+ // Get a pointer to the device context structure that we just associated
+ // with the device object. We define this structure in the device.h
+ // header file. DeviceGetContext is an inline function generated by
+ // using the WDF_DECLARE_CONTEXT_TYPE_WITH_NAME macro in device.h.
+ // This function will do the type checking and return the device context.
+ // If you pass a wrong object handle it will return NULL and assert if
+ // run under framework verifier mode.
+ //
+ deviceContext = DeviceGetContext(device);
+
+ //
+ // Initialize the context.
+ //
+ deviceContext->PrivateDeviceData = 0;
+
+ //
+ // Create a device interface so that applications can find and talk
+ // to us.
+ //
+ status = WdfDeviceCreateDeviceInterface(
+ device,
+ &CAMERA_CATEGORY,
+ &szReference // ReferenceString
+ );
+
+ if (NT_SUCCESS(status)) {
+ status = WdfDeviceCreateDeviceInterface(
+ device,
+ &CAPTURE_CATEGORY,
+ &szReference // ReferenceString
+ );
+ }
+
+ if (NT_SUCCESS(status)) {
+ status = WdfDeviceCreateDeviceInterface(
+ device,
+ &VIDEO_CATEGORY,
+ &szReference // ReferenceString
+ );
+ }
+
+ if (NT_SUCCESS(status)) {
+ //
+ // Initialize the I/O Package and any Queues
+ //
+ status = SimpleMediaSourceDriverQueueInitialize(device);
+ }
+ }
+
+ return status;
+}