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
|
//
// Copyright (C) Microsoft. All rights reserved.
//
#include "precomp.h"
#include "device.h"
#include "power.h"
MINIPORT_DRIVER_CONTEXT GlobalControl = {0};
EXTERN_C __declspec(code_seg("INIT")) DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_UNLOAD EvtDriverUnload;
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;
#define MBB_DRIVER_DEFAULT_POOL_TAG 'DBMW'
__declspec(code_seg("INIT")) NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT driverObject, _In_ PUNICODE_STRING registryPath)
{
NTSTATUS status = STATUS_SUCCESS;
WDF_DRIVER_CONFIG driverConfig;
WDF_DRIVER_CONFIG_INIT(&driverConfig, EvtDriverDeviceAdd);
driverConfig.DriverPoolTag = MBB_DRIVER_DEFAULT_POOL_TAG;
driverConfig.EvtDriverUnload = EvtDriverUnload;
WDFDRIVER driver;
status = WdfDriverCreate(driverObject, registryPath, WDF_NO_OBJECT_ATTRIBUTES, &driverConfig, &driver);
if (!NT_SUCCESS(status))
{
goto Exit;
}
Exit:
return status;
}
NTSTATUS
EvtDriverDeviceAdd(_In_ WDFDRIVER driver, _Inout_ PWDFDEVICE_INIT deviceInit)
{
UNREFERENCED_PARAMETER((driver));
NTSTATUS status = STATUS_SUCCESS;
status = NetDeviceInitConfig(deviceInit);
if (!NT_SUCCESS(status))
{
goto Exit;
}
status = MbbDeviceInitConfig(deviceInit);
if (!NT_SUCCESS(status))
{
goto Exit;
}
// Register with the NetAdapter framework that we want to do the Device Reset
//NET_DEVICE_RESET_CONFIG resetConfig;
//NET_DEVICE_RESET_CONFIG_INIT(&resetConfig, EvtMbbDeviceReset);
//NetDeviceInitSetResetConfig(deviceInit, &resetConfig);
NET_DEVICE_POWER_POLICY_EVENT_CALLBACKS netPowerPolicyCallbacks;
NET_DEVICE_POWER_POLICY_EVENT_CALLBACKS_INIT(&netPowerPolicyCallbacks);
netPowerPolicyCallbacks.EvtDevicePreviewBitmapPattern = EvtDevicePreviewBitmapPattern;
NetDeviceInitSetPowerPolicyEventCallbacks(deviceInit, &netPowerPolicyCallbacks);
WDF_OBJECT_ATTRIBUTES deviceAttributes;
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&deviceAttributes, WMBCLASS_DEVICE_CONTEXT);
WDF_PNPPOWER_EVENT_CALLBACKS pnpPowerCallbacks;
WDF_PNPPOWER_EVENT_CALLBACKS_INIT(&pnpPowerCallbacks);
pnpPowerCallbacks.EvtDevicePrepareHardware = EvtDevicePrepareHardware;
pnpPowerCallbacks.EvtDeviceReleaseHardware = EvtDeviceReleaseHardware;
pnpPowerCallbacks.EvtDeviceSurpriseRemoval = EvtDeviceSurpriseRemoval;
pnpPowerCallbacks.EvtDeviceD0Entry = EvtDeviceD0Entry;
pnpPowerCallbacks.EvtDeviceD0Exit = EvtDeviceD0Exit;
WdfDeviceInitSetPnpPowerEventCallbacks(deviceInit, &pnpPowerCallbacks);
WDF_POWER_POLICY_EVENT_CALLBACKS powerPolicyCallbacks;
WDF_POWER_POLICY_EVENT_CALLBACKS_INIT(&powerPolicyCallbacks);
powerPolicyCallbacks.EvtDeviceArmWakeFromS0 = EvtDeviceArmWakeFromS0;
powerPolicyCallbacks.EvtDeviceDisarmWakeFromS0 = EvtDeviceDisarmWakeFromS0;
WdfDeviceInitSetPowerPolicyEventCallbacks(deviceInit, &powerPolicyCallbacks);
WDFDEVICE wdfDevice;
status = WdfDeviceCreate(&deviceInit, &deviceAttributes, &wdfDevice);
if (!NT_SUCCESS(status))
{
goto Exit;
}
// Set the device to be not ejectable
WDF_DEVICE_PNP_CAPABILITIES pnpCapabilities;
WDF_DEVICE_PNP_CAPABILITIES_INIT(&pnpCapabilities);
pnpCapabilities.SurpriseRemovalOK = WdfTrue;
WdfDeviceSetPnpCapabilities(wdfDevice, &pnpCapabilities);
PWMBCLASS_DEVICE_CONTEXT deviceContext = WmbClassGetDeviceContext(wdfDevice);
deviceContext->WdfDevice = wdfDevice;
MBB_DEVICE_CONFIG mbbDeviceConfig;
MBB_DEVICE_CONFIG_INIT(
&mbbDeviceConfig, EvtMbbDeviceSendMbimFragment, EvtMbbDeviceReceiveMbimFragment, EvtMbbDeviceSendDeviceServiceSessionData, EvtMbbDeviceCreateAdapter);
status = MbbDeviceInitialize(wdfDevice, &mbbDeviceConfig);
if (!NT_SUCCESS(status))
{
goto Exit;
}
Exit:
return status;
}
VOID EvtDriverUnload(_In_ WDFDRIVER driver)
{
UNREFERENCED_PARAMETER(driver);
}
|