ReactOS  0.4.13-dev-479-gec9c8fd
pnp.c
Go to the documentation of this file.
1 /* Copyright (c) Mark Harmstone 2016-17
2  *
3  * This file is part of WinBtrfs.
4  *
5  * WinBtrfs is free software: you can redistribute it and/or modify
6  * it under the terms of the GNU Lesser General Public Licence as published by
7  * the Free Software Foundation, either version 3 of the Licence, or
8  * (at your option) any later version.
9  *
10  * WinBtrfs is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU Lesser General Public Licence for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public Licence
16  * along with WinBtrfs. If not, see <http://www.gnu.org/licenses/>. */
17 
18 #include "btrfs_drv.h"
19 
20 struct pnp_context;
21 
22 typedef struct {
28 } pnp_stripe;
29 
30 typedef struct {
35 } pnp_context;
36 
38 extern LIST_ENTRY pdo_list;
39 
40 _Function_class_(IO_COMPLETION_ROUTINE)
41 #ifdef __REACTOS__
42 static NTSTATUS NTAPI pnp_completion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID conptr) {
43 #else
44 static NTSTATUS pnp_completion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID conptr) {
45 #endif
46  pnp_stripe* stripe = conptr;
47  pnp_context* context = (pnp_context*)stripe->context;
48 
50 
51  stripe->Status = Irp->IoStatus.Status;
52 
54 
55  if (context->left == 0)
56  KeSetEvent(&context->Event, 0, FALSE);
57 
59 }
60 
63  ULONG num_devices, i;
65  LIST_ENTRY* le;
66 
69 
70  num_devices = (ULONG)min(0xffffffff, Vcb->superblock.num_devices);
71 
72  context.stripes = ExAllocatePoolWithTag(NonPagedPool, sizeof(pnp_stripe) * num_devices, ALLOC_TAG);
73  if (!context.stripes) {
74  ERR("out of memory\n");
76  }
77 
78  RtlZeroMemory(context.stripes, sizeof(pnp_stripe) * num_devices);
79 
80  i = 0;
81  le = Vcb->devices.Flink;
82 
83  while (le != &Vcb->devices) {
86 
87  if (dev->devobj) {
88  context.stripes[i].context = (struct pnp_context*)&context;
89 
90  context.stripes[i].Irp = IoAllocateIrp(dev->devobj->StackSize, FALSE);
91 
92  if (!context.stripes[i].Irp) {
93  UINT64 j;
94 
95  ERR("IoAllocateIrp failed\n");
96 
97  for (j = 0; j < i; j++) {
98  if (context.stripes[j].dev->devobj) {
99  IoFreeIrp(context.stripes[j].Irp);
100  }
101  }
102  ExFreePool(context.stripes);
103 
105  }
106 
107  IrpSp = IoGetNextIrpStackLocation(context.stripes[i].Irp);
110 
111  context.stripes[i].Irp->UserIosb = &context.stripes[i].iosb;
112 
113  IoSetCompletionRoutine(context.stripes[i].Irp, pnp_completion, &context.stripes[i], TRUE, TRUE, TRUE);
114 
115  context.stripes[i].Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
116  context.stripes[i].dev = dev;
117 
118  context.left++;
119  }
120 
121  le = le->Flink;
122  }
123 
124  if (context.left == 0) {
126  goto end;
127  }
128 
129  for (i = 0; i < num_devices; i++) {
130  if (context.stripes[i].Irp) {
131  IoCallDriver(context.stripes[i].dev->devobj, context.stripes[i].Irp);
132  }
133  }
134 
136 
138 
139  for (i = 0; i < num_devices; i++) {
140  if (context.stripes[i].Irp) {
141  if (context.stripes[i].Status != STATUS_SUCCESS)
142  Status = context.stripes[i].Status;
143  }
144  }
145 
146 end:
147  for (i = 0; i < num_devices; i++) {
148  if (context.stripes[i].Irp) {
149  IoFreeIrp(context.stripes[i].Irp);
150  }
151  }
152 
153  ExFreePool(context.stripes);
154 
155  return Status;
156 }
157 
161 
162  ExAcquireResourceSharedLite(&Vcb->tree_lock, TRUE);
163 
164  ExAcquireResourceExclusiveLite(&Vcb->fileref_lock, TRUE);
165 
166  if (Vcb->root_fileref && Vcb->root_fileref->fcb && (Vcb->root_fileref->open_count > 0 || has_open_children(Vcb->root_fileref))) {
168  goto end;
169  }
170 
172  if (!NT_SUCCESS(Status)) {
173  WARN("send_disks_pnp_message returned %08x\n", Status);
174  goto end;
175  }
176 
177 end:
178  ExReleaseResourceLite(&Vcb->fileref_lock);
179  ExReleaseResourceLite(&Vcb->tree_lock);
180 
181  return STATUS_SUCCESS;
182 }
183 
187 
189 
190  if (Vcb->root_fileref && Vcb->root_fileref->fcb && (Vcb->root_fileref->open_count > 0 || has_open_children(Vcb->root_fileref))) {
192  goto end;
193  }
194 
196  if (!NT_SUCCESS(Status)) {
197  WARN("send_disks_pnp_message returned %08x\n", Status);
198  goto end;
199  }
200 
201  Vcb->removing = TRUE;
202 
203  if (Vcb->need_write && !Vcb->readonly) {
204  Status = do_write(Vcb, Irp);
205 
206  free_trees(Vcb);
207 
208  if (!NT_SUCCESS(Status)) {
209  ERR("do_write returned %08x\n", Status);
210  goto end;
211  }
212  }
213 
214 
216 end:
217  ExReleaseResourceLite(&Vcb->tree_lock);
218 
219  return Status;
220 }
221 
225 
226  ExAcquireResourceSharedLite(&Vcb->tree_lock, TRUE);
227 
229 
230  if (!NT_SUCCESS(Status))
231  WARN("send_disks_pnp_message returned %08x\n", Status);
232 
233  ExReleaseResourceLite(&Vcb->tree_lock);
234 
235  if (DeviceObject->Vpb->Flags & VPB_MOUNTED) {
237  if (!NT_SUCCESS(Status)) {
238  WARN("FsRtlNotifyVolumeEvent returned %08x\n", Status);
239  }
240 
241  if (Vcb->vde)
242  Vcb->vde->mounted_device = NULL;
243 
245  Vcb->removing = TRUE;
246  ExReleaseResourceLite(&Vcb->tree_lock);
247 
248  if (Vcb->open_files == 0)
249  uninit(Vcb);
250  }
251 
252  return STATUS_SUCCESS;
253 }
254 
257 
258  TRACE("(%p, %p)\n", DeviceObject, Irp);
259 
260  if (DeviceObject->Vpb->Flags & VPB_MOUNTED) {
262 
263  if (Vcb->vde)
264  Vcb->vde->mounted_device = NULL;
265 
266  Vcb->removing = TRUE;
267 
268  ExReleaseResourceLite(&Vcb->tree_lock);
269 
270  if (Vcb->open_files == 0)
271  uninit(Vcb);
272  }
273 
274  return STATUS_SUCCESS;
275 }
276 
279  PDEVICE_CAPABILITIES dc = IrpSp->Parameters.DeviceCapabilities.Capabilities;
280 
281  dc->UniqueID = TRUE;
282  dc->SilentInstall = TRUE;
283 
284  Irp->IoStatus.Status = STATUS_SUCCESS;
285 }
286 
289  ULONG num_children;
290  LIST_ENTRY* le;
291  ULONG drsize, i;
292  DEVICE_RELATIONS* dr;
293 
295 
296  num_children = 0;
297 
298  le = pdo_list.Flink;
299  while (le != &pdo_list) {
300  num_children++;
301 
302  le = le->Flink;
303  }
304 
305  drsize = offsetof(DEVICE_RELATIONS, Objects[0]) + (num_children * sizeof(PDEVICE_OBJECT));
307 
308  if (!dr) {
309  ERR("out of memory\n");
311  goto end;
312  }
313 
314  dr->Count = num_children;
315 
316  i = 0;
317  le = pdo_list.Flink;
318  while (le != &pdo_list) {
320 
321  ObReferenceObject(pdode->pdo);
322  dr->Objects[i] = pdode->pdo;
323  i++;
324 
325  le = le->Flink;
326  }
327 
328  Irp->IoStatus.Information = (ULONG_PTR)dr;
329 
331 
332 end:
334 
335  Irp->IoStatus.Status = Status;
337 
338  return Status;
339 }
340 
342  WCHAR* out;
343 
344  static const WCHAR ids[] = L"ROOT\\btrfs\0";
345 
347  if (!out) {
348  ERR("out of memory\n");
350  }
351 
352  RtlCopyMemory(out, ids, sizeof(ids));
353 
354  Irp->IoStatus.Information = (ULONG_PTR)out;
355 
356  return STATUS_SUCCESS;
357 }
358 
361 
362  switch (IrpSp->MinorFunction) {
365  break;
366 
368  if (IrpSp->Parameters.QueryDeviceRelations.Type != BusRelations || no_pnp)
369  break;
370 
372 
373  case IRP_MN_QUERY_ID:
374  {
376 
377  if (IrpSp->Parameters.QueryId.IdType != BusQueryHardwareIDs)
378  break;
379 
381 
382  Irp->IoStatus.Status = Status;
384 
385  return Status;
386  }
387  }
388 
390  return IoCallDriver(cde->attached_device, Irp);
391 }
392 
394  WCHAR name[100], *noff, *out;
395  int i;
396 
397  static const WCHAR pref[] = L"Btrfs\\";
398 
399  RtlCopyMemory(name, pref, sizeof(pref) - sizeof(WCHAR));
400 
401  noff = &name[(sizeof(pref) / sizeof(WCHAR)) - 1];
402  for (i = 0; i < 16; i++) {
403  *noff = hex_digit(pdode->uuid.uuid[i] >> 4); noff++;
404  *noff = hex_digit(pdode->uuid.uuid[i] & 0xf); noff++;
405 
406  if (i == 3 || i == 5 || i == 7 || i == 9) {
407  *noff = '-';
408  noff++;
409  }
410  }
411  *noff = 0;
412 
414  if (!out) {
415  ERR("out of memory\n");
417  }
418 
419  RtlCopyMemory(out, name, (wcslen(name) + 1) * sizeof(WCHAR));
420 
421  Irp->IoStatus.Information = (ULONG_PTR)out;
422 
423  return STATUS_SUCCESS;
424 }
425 
427  WCHAR* out;
428 
429  static const WCHAR ids[] = L"BtrfsVolume\0";
430 
432  if (!out) {
433  ERR("out of memory\n");
435  }
436 
437  RtlCopyMemory(out, ids, sizeof(ids));
438 
439  Irp->IoStatus.Information = (ULONG_PTR)out;
440 
441  return STATUS_SUCCESS;
442 }
443 
446 
447  switch (IrpSp->Parameters.QueryId.IdType) {
448  case BusQueryDeviceID:
449  TRACE("BusQueryDeviceID\n");
450  return pdo_query_device_id(pdode, Irp);
451 
452  case BusQueryHardwareIDs:
453  TRACE("BusQueryHardwareIDs\n");
454  return pdo_query_hardware_ids(Irp);
455 
456  default:
457  break;
458  }
459 
460  return Irp->IoStatus.Status;
461 }
462 
466 
467  switch (IrpSp->MinorFunction) {
468  case IRP_MN_QUERY_ID:
469  return pdo_query_id(pdode, Irp);
470 
471  case IRP_MN_START_DEVICE:
475  return STATUS_SUCCESS;
476 
478  return STATUS_UNSUCCESSFUL;
479  }
480 
481  return Irp->IoStatus.Status;
482 }
483 
490  BOOL top_level;
491 
493 
494  top_level = is_top_level(Irp);
495 
496  if (Vcb && Vcb->type == VCB_TYPE_CONTROL) {
498  goto exit;
499  } else if (Vcb && Vcb->type == VCB_TYPE_VOLUME) {
502  Status = IoCallDriver(vde->pdo, Irp);
503  goto exit;
504  } else if (Vcb && Vcb->type == VCB_TYPE_PDO) {
506  goto end;
507  } else if (!Vcb || Vcb->type != VCB_TYPE_FS) {
509  goto end;
510  }
511 
513 
514  switch (IrpSp->MinorFunction) {
517  break;
518 
521  break;
522 
525  break;
526 
529  break;
530 
531  default:
532  TRACE("passing minor function 0x%x on\n", IrpSp->MinorFunction);
533 
535  Status = IoCallDriver(Vcb->Vpb->RealDevice, Irp);
536  goto exit;
537  }
538 
539 end:
540  Irp->IoStatus.Status = Status;
541 
543 
544 exit:
545  TRACE("returning %08x\n", Status);
546 
547  if (top_level)
549 
551 
552  return Status;
553 }
NTSTATUS pnp_query_remove_device(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: pnp.c:184
#define IRP_MN_CANCEL_REMOVE_DEVICE
#define VCB_TYPE_PDO
Definition: btrfs_drv.h:653
#define hex_digit(c)
Definition: btrfs_drv.h:1716
#define FSRTL_VOLUME_DISMOUNT
Definition: ntifs_ex.h:439
ERESOURCE pdo_list_lock
Definition: btrfs.c:93
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define IRP_MN_QUERY_ID
#define FsRtlEnterFileSystem
#define FsRtlExitFileSystem
#define STATUS_NOT_IMPLEMENTED
Definition: ntstatus.h:225
static NTSTATUS pdo_query_hardware_ids(PIRP Irp)
Definition: pnp.c:426
#define STATUS_MORE_PROCESSING_REQUIRED
Definition: shellext.h:63
Definition: http.c:6587
NTSTATUS Status
Definition: pnp.c:26
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
struct _DEVICE_OBJECT * PDEVICE_OBJECT
PDEVICE_OBJECT Objects[1]
Definition: iotypes.h:2054
NTSTATUS do_write(device_extension *Vcb, PIRP Irp)
Definition: flushthread.c:7523
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
UINT8 uuid[16]
Definition: btrfs.h:122
#define WARN(fmt,...)
Definition: debug.h:111
LONG NTSTATUS
Definition: precomp.h:26
UINT32 no_pnp
Definition: btrfs.c:83
Definition: write.c:115
PDEVICE_OBJECT pdo
Definition: btrfs_drv.h:856
#define VCB_TYPE_FS
Definition: btrfs_drv.h:650
HDC dc
Definition: cylfrac.c:34
PDEVICE_OBJECT attached_device
Definition: btrfs_drv.h:829
pnp_stripe * stripes
Definition: pnp.c:34
GLuint GLuint end
Definition: gl.h:1545
void uninit(_In_ device_extension *Vcb)
Definition: btrfs.c:1780
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:159
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
static int dev
Definition: mkdosfs.c:536
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:515
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
Definition: resource.c:770
PDEVICE_OBJECT pdo
Definition: btrfs_drv.h:868
#define ALLOC_TAG
Definition: btrfs_drv.h:86
static NTSTATUS pnp_remove_device(PDEVICE_OBJECT DeviceObject)
Definition: pnp.c:222
GLuint * ids
Definition: glext.h:5907
NTSTATUS Status
Definition: pnp.c:32
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define IRP_MN_QUERY_REMOVE_DEVICE
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
Definition: devices.h:37
_Function_class_(IO_COMPLETION_ROUTINE)
Definition: pnp.c:40
PVOID DeviceExtension
Definition: env_spec_w32.h:418
static NTSTATUS bus_pnp(control_device_extension *cde, PIRP Irp)
Definition: pnp.c:359
smooth NULL
Definition: ftsmooth.c:416
#define offsetof(TYPE, MEMBER)
_Dispatch_type_(IRP_MJ_PNP)
Definition: pnp.c:484
#define IoCompleteRequest
Definition: irp.c:1240
#define UNUSED(x)
Definition: btrfs_drv.h:81
void free_trees(device_extension *Vcb)
Definition: treefuncs.c:793
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
IO_STATUS_BLOCK iosb
Definition: pnp.c:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
struct pnp_context * context
Definition: pnp.c:23
Definition: pnp.c:22
struct _LIST_ENTRY * Flink
Definition: typedefs.h:119
#define IRP_MN_SURPRISE_REMOVAL
Definition: ntifs_ex.h:408
#define TRACE(s)
Definition: solgame.cpp:4
NTSTATUS NTAPI FsRtlNotifyVolumeEvent(IN PFILE_OBJECT FileObject, IN ULONG EventCode)
Definition: pnp.c:38
__wchar_t WCHAR
Definition: xmlstorage.h:180
PIRP Irp
Definition: pnp.c:24
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define VCB_TYPE_VOLUME
Definition: btrfs_drv.h:652
static void bus_query_capabilities(PIRP Irp)
Definition: pnp.c:277
#define Vcb
Definition: cdprocs.h:1425
#define IRP_MN_START_DEVICE
static FILE * out
Definition: regtests2xml.c:44
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1817
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
LONG left
Definition: pnp.c:33
unsigned char UCHAR
Definition: xmlstorage.h:181
static NTSTATUS pdo_query_device_id(pdo_device_extension *pdode, PIRP Irp)
Definition: pnp.c:393
VOID NTAPI IoSetTopLevelIrp(IN PIRP Irp)
Definition: irp.c:2000
static const WCHAR L[]
Definition: oid.c:1250
static NTSTATUS bus_query_device_relations(PIRP Irp)
Definition: pnp.c:287
#define InterlockedDecrement
Definition: armddk.h:52
Definition: typedefs.h:117
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2647
DRIVER_DISPATCH(nfs41_FsdDispatch)
static NTSTATUS pnp_cancel_remove_device(PDEVICE_OBJECT DeviceObject)
Definition: pnp.c:158
* PDEVICE_CAPABILITIES
Definition: iotypes.h:927
#define VCB_TYPE_CONTROL
Definition: btrfs_drv.h:651
Status
Definition: gdiplustypes.h:24
static NTSTATUS pdo_pnp(PDEVICE_OBJECT pdo, PIRP Irp)
Definition: pnp.c:463
#define ERR(fmt,...)
Definition: debug.h:109
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
device * dev
Definition: pnp.c:27
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
static NTSTATUS send_disks_pnp_message(device_extension *Vcb, UCHAR minor)
Definition: pnp.c:61
_In_ PIO_STACK_LOCATION IrpSp
Definition: create.c:4157
#define min(a, b)
Definition: monoChain.cc:55
Definition: list.h:27
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
BOOL is_top_level(_In_ PIRP Irp)
Definition: btrfs.c:256
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
Definition: resource.c:885
LIST_ENTRY pdo_list
Definition: btrfs.c:94
Definition: name.c:36
#define ObReferenceObject
Definition: obfuncs.h:204
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1666
ULONG ERESOURCE
Definition: env_spec_w32.h:594
#define STATUS_NOT_SUPPORTED
Definition: ntstatus.h:409
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:565
#define minor(rdev)
Definition: propsheet.cpp:880
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ULONG_PTR
Definition: config.h:101
static NTSTATUS pdo_query_id(pdo_device_extension *pdode, PIRP Irp)
Definition: pnp.c:444
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:615
BOOL has_open_children(file_ref *fileref)
Definition: fileinfo.c:436
void exit(int exitcode)
Definition: _exit.c:33
unsigned long long UINT64
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2771
return STATUS_SUCCESS
Definition: btrfs.c:2777
#define VPB_MOUNTED
Definition: iotypes.h:1763
static NTSTATUS bus_query_hardware_ids(PIRP Irp)
Definition: pnp.c:341
KEVENT Event
Definition: pnp.c:31
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define ExFreePool(addr)
Definition: env_spec_w32.h:352
#define IRP_MN_QUERY_CAPABILITIES
NTSTATUS pnp_surprise_removal(PDEVICE_OBJECT DeviceObject, PIRP Irp)
Definition: pnp.c:255