blk82930.h
9.64 KB
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
/*++
Copyright (c) 1997-1998 Microsoft Corporation
Module Name:
Blk82930.h
Abstract:
Kernel mode definitions and function prototypes
Environment:
Kernel mode
Notes:
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.
Copyright (c) 1997-1998 Microsoft Corporation. All Rights Reserved.
Revision History:
11/18/97 : created
--*/
#ifndef BLK829_INCD
#define BLK829_INCD
#include "BusbDbg.h"
// the size of the transfer buffer on your test board or device
#define BULKUSB_TEST_BOARD_TRANSFER_BUFFER_SIZE (64 *1024 )
#define BULKUSB_MAX_TRANSFER_SIZE 256
// used to track driver-generated io irps for staged read/write processing
typedef struct _BULKUSB_RW_CONTEXT {
PURB Urb;
PDEVICE_OBJECT DeviceObject;
PIRP Irp;
PMDL Mdl;
} BULKUSB_RW_CONTEXT, *PBULKUSB_RW_CONTEXT;
// used to track information on pipes in use;
// currently just to flag if opened or closed
typedef struct BULKUSB_PIPEINFO {
BOOLEAN fPipeOpened;
} BULKUSB_PIPEINFO, *PBULKUSB_PIPEINFO;
//
// A structure representing the instance information associated with
// this particular device.
//
typedef struct _DEVICE_EXTENSION {
// Device object we call when submitting Urbs
PDEVICE_OBJECT TopOfStackDeviceObject;
// The bus driver object
PDEVICE_OBJECT PhysicalDeviceObject;
DEVICE_POWER_STATE CurrentDevicePowerState;
// USB configuration handle and ptr for the configuration the
// device is currently in
USBD_CONFIGURATION_HANDLE UsbConfigurationHandle;
PUSB_CONFIGURATION_DESCRIPTOR UsbConfigurationDescriptor;
// ptr to the USB device descriptor
// for this device
PUSB_DEVICE_DESCRIPTOR UsbDeviceDescriptor;
// we support one interface
// this is a copy of the info structure
// returned from select_configuration or
// select_interface
PUSBD_INTERFACE_INFORMATION UsbInterface;
//Bus drivers set the appropriate values in this structure in response
//to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might
//alter the capabilities set by the bus driver.
DEVICE_CAPABILITIES DeviceCapabilities;
// used to save the currently-being-handled system-requested power irp request
PIRP PowerIrp;
// used to save base Irp ( user-originated via IOCTL ) of staged read/write request
PIRP BaseIrp;
// used to save URB of short, non-staged read/write requests
PURB BaseUrb;
// count of self-staged irps pending
ULONG StagedPendingIrpCount;
// count of self-staged bytes read or written so far
ULONG StagedBytesTransferred;
// set when PendingIoCount goes to 0; flags device can be removed
KEVENT RemoveEvent;
// set when BulkUsb_AsyncReadWrite_Complete() finishes or cancels last staged io irp
KEVENT StagingDoneEvent;
// set when PendingIoCount goes to 1 ( 1st increment was on add device )
// this indicates no IO requests outstanding, either user, system, or self-staged
KEVENT NoPendingIoEvent;
// set to signal driver-generated power request is finished
KEVENT SelfRequestedPowerIrpEvent;
// spinlock used to protect inc/dec iocount logic
KSPIN_LOCK IoCountSpinLock;
// incremented when device is added and any IO request is received;
// decremented when any io request is completed or passed on, and when device is removed
ULONG PendingIoCount;
// count of open pipes
ULONG OpenPipeCount;
// ptr to array of structs to track pipeinfo;
// in this basic sample it's only used to track if open/closed;
PBULKUSB_PIPEINFO PipeInfo;
// save ptr to array of info on self-generated IRPS for staged read/writes;
// will allocate this separately
PBULKUSB_RW_CONTEXT PendingIoIrps;
// Name buffer for our named Functional device object link
// The name is generated based on the driver's class GUID
WCHAR DeviceLinkNameBuffer[ MAXIMUM_FILENAME_LENGTH ]; // MAXIMUM_FILENAME_LENGTH defined in wdm.h
//flag set when processing IRP_MN_REMOVE_DEVICE
BOOLEAN DeviceRemoved;
// flag set when driver has answered success to IRP_MN_QUERY_REMOVE_DEVICE
BOOLEAN RemoveDeviceRequested;
// flag set when driver has answered success to IRP_MN_QUERY_STOP_DEVICE
BOOLEAN StopDeviceRequested;
// flag set when device has been successfully started
BOOLEAN DeviceStarted;
// flag set when IRP_MN_WAIT_WAKE is received and we're in a power state
// where we can signal a wait
BOOLEAN EnabledForWakeup;
// used to flag that we're currently handling a self-generated power request
BOOLEAN SelfPowerIrp;
// default power state to power down to on self-suspend
ULONG PowerDownLevel;
// default maximum transfer per staged irp size
ULONG MaximumTransferSize;
// spinlock used to protect test of deviceExtension->BaseIrp in
// BulkUsb_StagedReadWrite()
KSPIN_LOCK FastCompleteSpinlock;
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
// function prototypes
NTSTATUS
BulkUsb_ProcessPnPIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_ProcessSysControlIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
BulkUsb_Unload(
IN PDRIVER_OBJECT DriverObject
);
NTSTATUS
BulkUsb_StartDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_StopDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_RemoveDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_CallUSBD(
IN PDEVICE_OBJECT DeviceObject,
IN PURB Urb
);
NTSTATUS
BulkUsb_PnPAddDevice(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject
);
NTSTATUS
BulkUsb_CreateDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PDEVICE_OBJECT *DeviceObject
);
NTSTATUS
BulkUsb_ConfigureDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_IrpCompletionRoutine(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
BulkUsb_PoRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
NTSTATUS
BulkUsb_PoSelfRequestCompletion(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR MinorFunction,
IN POWER_STATE PowerState,
IN PVOID Context,
IN PIO_STATUS_BLOCK IoStatus
);
PURB
BulkUsb_BuildAsyncRequest(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PUSBD_PIPE_INFORMATION PipeHandle,
IN BOOLEAN Read
);
NTSTATUS
BulkUsb_GetPortStatus(
IN PDEVICE_OBJECT DeviceObject,
IN PULONG PortStatus
);
NTSTATUS
BulkUsb_ResetParentPort(
IN IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_SelfRequestPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN POWER_STATE PowerState
);
BOOLEAN
BulkUsb_SetDevicePowerState(
IN PDEVICE_OBJECT DeviceObject,
IN DEVICE_POWER_STATE DeviceState
);
NTSTATUS
BulkUsb_AsyncReadWrite_Complete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
BulkUsb_SimpleReadWrite_Complete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
BulkUsb_PowerIrp_Complete(
IN PDEVICE_OBJECT NullDeviceObject,
IN PIRP Irp,
IN PVOID Context
);
NTSTATUS
BulkUsb_QueryCapabilities(
IN PDEVICE_OBJECT PdoDeviceObject,
IN PDEVICE_CAPABILITIES DeviceCapabilities
);
NTSTATUS
BulkUsb_Write(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_Create(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_Read(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_AbortPipes(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_ProcessIOCTL(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_SelectInterface(
IN PDEVICE_OBJECT DeviceObject,
IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
);
NTSTATUS
BulkUsb_ResetDevice(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_Close(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_ResetPipe(
IN PDEVICE_OBJECT DeviceObject,
IN PUSBD_PIPE_INFORMATION PipeInfo
);
VOID
BulkUsb_IncrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
LONG
BulkUsb_DecrementIoCount(
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
BulkUsb_ProcessPowerIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
BulkUsb_StagedReadWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN BOOLEAN Read
);
NTSTATUS
BulkUsb_SelfSuspendOrActivate(
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN fSuspend
);
NTSTATUS
BulkUsb_SymbolicLink(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PUNICODE_STRING deviceLinkUnicodeString
);
BOOLEAN
BulkUsb_CancelPendingIo(
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
BulkUsb_CanAcceptIoRequests(
IN PDEVICE_OBJECT DeviceObject
);
PBULKUSB_PIPEINFO BulkUsb_PipeWithName(
IN PDEVICE_OBJECT DeviceObject,
IN PUNICODE_STRING FileName
);
#endif // already included