1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
/*++
Copyright (c) Microsoft Corporation. All rights reserved.
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
PURPOSE.
Module Name:
device.c
Abstract:
This module contains the Windows Driver Framework Device object
handlers for the firefly filter driver.
Environment:
Kernel mode
--*/
#include "FireFly.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE, FireFlyEvtDeviceAdd)
#endif
NTSTATUS
FireFlyEvtDeviceAdd(
WDFDRIVER Driver,
PWDFDEVICE_INIT DeviceInit
)
/*++
Routine Description:
EvtDeviceAdd is called by the framework in response to AddDevice
call from the PnP manager. We create and initialize a device object to
represent to be part of the device stack as a filter.
Arguments:
Driver - Handle to a framework driver object created in DriverEntry
DeviceInit - Pointer to a framework-allocated WDFDEVICE_INIT structure.
Return Value:
NTSTATUS
--*/
{
WDF_OBJECT_ATTRIBUTES attributes;
NTSTATUS status;
PDEVICE_CONTEXT pDeviceContext;
WDFDEVICE device;
WDFMEMORY memory;
size_t bufferLength;
UNREFERENCED_PARAMETER(Driver);
PAGED_CODE();
//
// Configure the device as a filter driver
//
WdfFdoInitSetFilter(DeviceInit);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, DEVICE_CONTEXT);
status = WdfDeviceCreate(&DeviceInit, &attributes, &device);
if (!NT_SUCCESS(status)) {
KdPrint(("FireFly: WdfDeviceCreate, Error %x\n", status));
return status;
}
//
// Driver Framework always zero initializes an objects context memory
//
pDeviceContext = WdfObjectGet_DEVICE_CONTEXT(device);
//
// Initialize our WMI support
//
status = WmiInitialize(device, pDeviceContext);
if (!NT_SUCCESS(status)) {
KdPrint(("FireFly: Error initializing WMI 0x%x\n", status));
return status;
}
//
// In order to send ioctls to our PDO, we have open to open it
// by name so that we have a valid filehandle (fileobject).
// When we send ioctls using the IoTarget, framework automatically
// sets the filobject in the stack location.
//
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
//
// By parenting it to device, we don't have to worry about
// deleting explicitly. It will be deleted along witht the device.
//
attributes.ParentObject = device;
status = WdfDeviceAllocAndQueryProperty(device,
DevicePropertyPhysicalDeviceObjectName,
NonPagedPoolNx,
&attributes,
&memory);
if (!NT_SUCCESS(status)) {
KdPrint(("FireFly: WdfDeviceAllocAndQueryProperty failed 0x%x\n", status));
return STATUS_UNSUCCESSFUL;
}
pDeviceContext->PdoName.Buffer = WdfMemoryGetBuffer(memory, &bufferLength);
if (pDeviceContext->PdoName.Buffer == NULL) {
return STATUS_UNSUCCESSFUL;
}
pDeviceContext->PdoName.MaximumLength = (USHORT) bufferLength;
pDeviceContext->PdoName.Length = (USHORT) bufferLength-sizeof(UNICODE_NULL);
return status;
}
|