ReactOS 0.4.16-dev-2633-g8dc9e50
atapi.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS ATA Port Driver
3 * LICENSE: MIT (https://spdx.org/licenses/MIT)
4 * PURPOSE: Driver entrypoint and utility functions
5 * COPYRIGHT: Copyright 2026 Dmitry Borisov <di.sean@protonmail.com>
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "atapi.h"
11
12/* GLOBALS ********************************************************************/
13
16
18static const struct
19{
24{
25 {"Disk", "GenDisk", "DiskPeripheral" }, // DIRECT_ACCESS_DEVICE
26 {"Sequential", "GenSequential", "TapePeripheral" }, // SEQUENTIAL_ACCESS_DEVICE
27 {"Printer", "GenPrinter", "PrinterPeripheral" }, // PRINTER_DEVICE
28 {"Processor", "GenProcessor", "ProcessorPeripheral" }, // PROCESSOR_DEVICE
29 {"Worm", "GenWorm", "WormPeripheral" }, // WRITE_ONCE_READ_MULTIPLE_DEVICE
30 {"CdRom", "GenCdRom", "CdRomPeripheral" }, // READ_ONLY_DIRECT_ACCESS_DEVICE
31 {"Scanner", "GenScanner", "ScannerPeripheral" }, // SCANNER_DEVICE
32 {"Optical", "GenOptical", "OpticalDiskPeripheral" }, // OPTICAL_DEVICE
33 {"Changer", "GenChanger", "MediumChangerPeripheral" }, // MEDIUM_CHANGER
34 {"Net", "GenNet", "CommunicationsPeripheral"}, // COMMUNICATION_DEVICE
35 {"Other", "IdeOther", "OtherPeripheral" }, // 10
36};
37
38/* FUNCTIONS ******************************************************************/
39
40CODE_SEG("PAGE")
45{
47
48 PAGED_CODE();
49
50 DeviceType = DevExt->InquiryData.DeviceType;
52
53 switch (Type)
54 {
55 case GetDeviceType:
56 return AtapGenericDeviceNames[DeviceType].DeviceType;
57
58 case GetPeripheralId:
59 return AtapGenericDeviceNames[DeviceType].PeripheralId;
60
61 case GetGenericType:
62 if (DevExt->Device.DeviceFlags & DEVICE_IS_SUPER_FLOPPY)
63 return "GenSFloppy"; // Install the Super Floppy storage class driver
64 else
65 return AtapGenericDeviceNames[DeviceType].GenericType;
66
67 default:
70 }
71}
72
73CODE_SEG("PAGE")
80{
84
85 PAGED_CODE();
86
88 KeyName,
90 RootKey,
91 NULL);
92
93 if (Create)
94 {
95 Status = ZwCreateKey(KeyHandle,
98 0,
99 NULL,
101 &Disposition);
102 }
103 else
104 {
106 }
107
108 return Status;
109}
110
111CODE_SEG("PAGE")
112VOID
117 _Out_ PULONG KeyValue,
119{
120 UCHAR Buffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(*KeyValue)];
121 HANDLE HwKeyHandle, TargetKeyHandle;
122 UNICODE_STRING ValueName, TargetKeyName;
124 WCHAR TargetKeyBuffer[sizeof("Target99")];
127
128 PAGED_CODE();
129
130 Status = IoOpenDeviceRegistryKey(ChanExt->Pdo,
133 &HwKeyHandle);
134 if (!NT_SUCCESS(Status))
135 {
136 TRACE("Failed to open device hardware key, status 0x%lx\n", Status);
137 return;
138 }
139
140 /* Open or create the 'TargetX' key */
141 Status = RtlStringCbPrintfW(TargetKeyBuffer,
142 sizeof(TargetKeyBuffer),
143 L"Target%u",
144 TargetId);
146 RtlInitUnicodeString(&TargetKeyName, TargetKeyBuffer);
147 Status = AtaOpenRegistryKey(&TargetKeyHandle, HwKeyHandle, &TargetKeyName, TRUE);
148 if (!NT_SUCCESS(Status))
149 {
150 TRACE("Failed to create '%wZ' key, status 0x%lx\n", &TargetKeyName, Status);
151 goto Cleanup;
152 }
153
155 Status = ZwQueryValueKey(TargetKeyHandle,
156 &ValueName,
158 PartialInfo,
159 sizeof(Buffer),
160 &ResultLength);
161 ZwClose(TargetKeyHandle);
162 if (!NT_SUCCESS(Status) ||
163 (PartialInfo->Type != REG_DWORD) ||
164 (PartialInfo->DataLength != sizeof(*KeyValue)))
165 {
166 TRACE("Failed to read '%wZ' key, status 0x%lx\n", &ValueName, Status);
167
168 *KeyValue = DefaultValue;
169 goto Cleanup;
170 }
171
172 *KeyValue = *(PULONG)&PartialInfo->Data;
173
174Cleanup:
175 ZwClose(HwKeyHandle);
176}
177
178CODE_SEG("PAGE")
179VOID
184 _In_ ULONG KeyValue)
185{
186 HANDLE HwKeyHandle, TargetKeyHandle;
187 UNICODE_STRING ValueName, TargetKeyName;
189 WCHAR TargetKeyBuffer[sizeof("Target99")];
190
191 PAGED_CODE();
192
193 Status = IoOpenDeviceRegistryKey(ChanExt->Pdo,
196 &HwKeyHandle);
197 if (!NT_SUCCESS(Status))
198 {
199 TRACE("Failed to open device hardware key, status 0x%lx\n", Status);
200 return;
201 }
202
203 /* Open or create the 'TargetX' key */
204 Status = RtlStringCbPrintfW(TargetKeyBuffer,
205 sizeof(TargetKeyBuffer),
206 L"Target%u",
207 TargetId);
209 RtlInitUnicodeString(&TargetKeyName, TargetKeyBuffer);
210 Status = AtaOpenRegistryKey(&TargetKeyHandle, HwKeyHandle, &TargetKeyName, TRUE);
211 if (!NT_SUCCESS(Status))
212 {
213 TRACE("Failed to create '%wZ' key, status 0x%lx\n", &TargetKeyName, Status);
214 goto Cleanup;
215 }
216
218 Status = ZwSetValueKey(TargetKeyHandle,
219 &ValueName,
220 0,
221 REG_DWORD,
222 &KeyValue,
223 sizeof(KeyValue));
224 ZwClose(TargetKeyHandle);
225 if (!NT_SUCCESS(Status))
226 {
227 TRACE("Failed to set '%wZ' key, status 0x%lx\n", &ValueName, Status);
228 }
229
230Cleanup:
231 ZwClose(HwKeyHandle);
232}
233
234CODE_SEG("PAGE")
235VOID
239 _In_ ULONG KeyValue)
240{
241 HANDLE HwKeyHandle;
244
245 PAGED_CODE();
246
247 Status = IoOpenDeviceRegistryKey(ChanExt->Pdo,
250 &HwKeyHandle);
251 if (!NT_SUCCESS(Status))
252 {
253 TRACE("Failed to open device hardware key, status 0x%lx\n", Status);
254 return;
255 }
256
258 Status = ZwSetValueKey(HwKeyHandle,
259 &ValueName,
260 0,
261 REG_DWORD,
262 &KeyValue,
263 sizeof(KeyValue));
264 ZwClose(HwKeyHandle);
265 if (!NT_SUCCESS(Status))
266 {
267 TRACE("Failed to set '%wZ' key, status 0x%lx\n", &ValueName, Status);
268 }
269}
270
271CODE_SEG("PAGE")
273NTAPI
277{
278 PAGED_CODE();
279
280 Irp->IoStatus.Status = STATUS_SUCCESS;
282
283 return STATUS_SUCCESS;
284}
285
286CODE_SEG("PAGE")
287VOID
288NTAPI
291{
292 PAGED_CODE();
293
295}
296
297VOID
298NTAPI
302{
304 PDEVICE_OBJECT TopDeviceObject;
305 PIRP Irp;
308 STORAGE_EVENT_NOTIFICATION EventObject;
310
312
314
316 EventObject.Size = sizeof(EventObject);
317 EventObject.Events = STORAGE_EVENT_ALL;
318
320 TopDeviceObject,
321 &EventObject,
322 sizeof(EventObject),
323 NULL,
324 0,
325 FALSE,
326 &Event,
327 &IoStatus);
328 if (!Irp)
329 {
330 ERR("IoBuildDeviceIoControlRequest() failed\n");
331 goto Exit;
332 }
333
335 if (Status == STATUS_PENDING)
336 {
338 Status = IoStatus.Status;
339 }
340
341 TRACE("Notification result %08lx\n", Status);
342
343Exit:
344 ObDereferenceObject(TopDeviceObject);
346}
347
348VOID
349NTAPI
351 _In_ PKDPC Dpc,
355{
357 ULONG DeviceBitmap = PtrToUlong(SystemArgument1);
359 ULONG i;
360
363
364 ChanExt = CONTAINING_RECORD(PortData, ATAPORT_CHANNEL_EXTENSION, PortData);
365
366 for (i = 0; i < ATA_MAX_DEVICE; ++i)
367 {
370
371 if (!(DeviceBitmap & (1 << i)))
372 continue;
373
374 DevExt = AtaFdoFindDeviceByPath(ChanExt,
375 AtaMarshallScsiAddress(PortData->PortNumber, i, 0),
377 if (!DevExt)
378 continue;
379
381 if (!WorkItem)
382 {
383 ERR("Failed to allocate workitem");
384 }
385 else
386 {
388 }
389
391 }
392}
393
394CODE_SEG("PAGE")
402{
404 PIRP Irp;
406 PIO_STACK_LOCATION IoStack;
408
409 PAGED_CODE();
410
412
414 CommonExt->LowerDeviceObject,
415 NULL,
416 0,
417 NULL,
418 &Event,
420 if (!Irp)
422
423 Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
424
427 IoStack->Parameters.QueryInterface.InterfaceType = Guid;
428 IoStack->Parameters.QueryInterface.Size = Size;
429 IoStack->Parameters.QueryInterface.Version = Version;
430 IoStack->Parameters.QueryInterface.Interface = Interface;
431 IoStack->Parameters.QueryInterface.InterfaceSpecificData = NULL;
432
433 Status = IoCallDriver(CommonExt->LowerDeviceObject, Irp);
434 if (Status == STATUS_PENDING)
435 {
438 }
439
440 return Status;
441}
442
443CODE_SEG("PAGE")
447 _In_ PIRP Irp,
449{
450 PATAPORT_COMMON_EXTENSION FdoExt = CommonExt->FdoExt;
451 PDEVICE_OBJECT TopDeviceObject;
452 PIO_STACK_LOCATION IoStack, SubStack;
453 PIRP SubIrp;
456
457 PAGED_CODE();
458 ASSERT(!IS_FDO(CommonExt));
459
460 TopDeviceObject = IoGetAttachedDeviceReference(FdoExt->Self);
461
462 SubIrp = IoAllocateIrp(TopDeviceObject->StackSize, FALSE);
463 if (!SubIrp)
464 {
465 ObDereferenceObject(TopDeviceObject);
467 }
468
470
472 SubStack = IoGetNextIrpStackLocation(SubIrp);
473 RtlCopyMemory(SubStack, IoStack, sizeof(*SubStack));
474
476 SubStack->Parameters.DeviceCapabilities.Capabilities = DeviceCapabilities;
477
480 &Event,
481 TRUE,
482 TRUE,
483 TRUE);
484
486
487 Status = IoCallDriver(TopDeviceObject, SubIrp);
488 if (Status == STATUS_PENDING)
489 {
491 }
492
493 ObDereferenceObject(TopDeviceObject);
494
495 Status = SubIrp->IoStatus.Status;
496 IoFreeIrp(SubIrp);
497
498 return Status;
499}
500
501CODE_SEG("PAGE")
505 _In_ PIRP Irp)
506{
507 PIO_STACK_LOCATION IoStack;
509 volatile LONG* Counter;
510
511 PAGED_CODE();
512
513 if (!IS_FDO(CommonExt))
514 {
515 Status = AtaPnpRepeatRequest(CommonExt, Irp, NULL);
516 }
517 else
518 {
519 if (!NT_VERIFY(IoForwardIrpSynchronously(CommonExt->LowerDeviceObject, Irp)))
520 return STATUS_UNSUCCESSFUL;
521 Status = Irp->IoStatus.Status;
522 }
523 if (!NT_SUCCESS(Status))
524 return Status;
525
527 switch (IoStack->Parameters.UsageNotification.Type)
528 {
530 Counter = &CommonExt->PageFiles;
531 break;
532
534 Counter = &CommonExt->HibernateFiles;
535 break;
536
538 Counter = &CommonExt->DumpFiles;
539 break;
540
541 default:
542 return Status;
543 }
544
546
547 if (!IS_FDO(CommonExt))
548 IoInvalidateDeviceState(CommonExt->Self);
549
550 return STATUS_SUCCESS;
551}
552
553CODE_SEG("PAGE")
557 _In_ PIRP Irp)
558{
559 PAGED_CODE();
560
561 if (CommonExt->PageFiles || CommonExt->HibernateFiles || CommonExt->DumpFiles)
562 Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE;
563
564 if (IS_FDO(CommonExt))
565 Irp->IoStatus.Status = STATUS_SUCCESS;
566
567 return STATUS_SUCCESS;
568}
569
570CODE_SEG("PAGE")
571VOID
574 _In_ PDEVICE_OBJECT SelfDeviceObject,
576{
577 PAGED_CODE();
578
579 CommonExt->Flags = Flags;
580 CommonExt->Self = SelfDeviceObject;
581 CommonExt->DevicePowerState = PowerDeviceD0;
582 CommonExt->SystemPowerState = PowerSystemWorking;
583
584 IoInitializeRemoveLock(&CommonExt->RemoveLock, ATAPORT_TAG, 0, 0);
585}
586
587CODE_SEG("PAGE")
589NTAPI
593{
598 WCHAR DeviceNameBuffer[sizeof("\\Device\\Ide\\IdePort99999")];
599 DECLARE_PAGED_WSTRING(FdoFormat, L"\\Device\\Ide\\IdePort%lu");
600 static ULONG AtapFdoNumber = 0;
601
602 PAGED_CODE();
603
604 Status = RtlStringCbPrintfW(DeviceNameBuffer,
605 sizeof(DeviceNameBuffer),
606 FdoFormat,
607 AtapFdoNumber);
609 RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
610
612
614 sizeof(*ChanExt),
615 &DeviceName,
618 FALSE,
619 &Fdo);
620 if (!NT_SUCCESS(Status))
621 {
622 ERR("Failed to create the FDO with status 0x%lx\n", Status);
623 return Status;
624 }
625
626 ChanExt = Fdo->DeviceExtension;
627
628 RtlZeroMemory(ChanExt, sizeof(*ChanExt));
630
632 if (!ChanExt->Common.LowerDeviceObject)
633 {
634 ERR("Failed to attach the FDO\n");
636 goto Failure;
637 }
638 ChanExt->DeviceObjectNumber = AtapFdoNumber++;
639 ChanExt->Pdo = PhysicalDeviceObject;
640
641 /* DMA buffers alignment */
643 Fdo->AlignmentRequirement = max(Fdo->AlignmentRequirement, ATA_MIN_BUFFER_ALIGNMENT);
644
646
647 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
648
649 return STATUS_SUCCESS;
650
651Failure:
652 if (ChanExt->Common.LowerDeviceObject)
654
656
657 return Status;
658}
659
660static
661CODE_SEG("INIT")
664{
669 KeyName, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\MiniNT");
670
671 PAGED_CODE();
672
674 &KeyName,
676 NULL,
677 NULL);
678
679 Status = ZwOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
680 if (NT_SUCCESS(Status))
681 {
683 return TRUE;
684 }
685
686 return FALSE;
687}
688
689static
690CODE_SEG("INIT")
691VOID
693{
697 DECLARE_PAGED_UNICODE_STRING(DirectoryName, L"\\Device\\Ide");
698
699 PAGED_CODE();
700
702 &DirectoryName,
704 NULL,
705 NULL);
706
708 if (NT_SUCCESS(Status))
709 {
710 /* We don't need a handle for a permanent object */
712 }
713 /*
714 * Ignore directory creation failures (don't report them as a driver initialization error)
715 * as the directory may have already been created by another driver.
716 * We will handle fatal errors later via IoCreateDevice() call.
717 */
718}
719
720CODE_SEG("INIT")
722NTAPI
726{
727 INFO("ATAPI driver entry\n");
728
729 // FIXME: No crashdump/hibernation support
730 if (!DriverObject)
732
733 /* Make a copy of the registry path */
740 {
742 }
745
749 DriverObject->MajorFunction[IRP_MJ_SCSI] = AtaDispatchScsi;
752 DriverObject->MajorFunction[IRP_MJ_PNP] = AtaDispatchPnp;
753 DriverObject->DriverExtension->AddDevice = AtaAddChannel;
754 DriverObject->DriverUnload = AtaUnload;
755
758
759 /* Create a directory to hold the driver's device objects */
761
763
764 return STATUS_SUCCESS;
765}
#define ExAllocatePoolUninitialized
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
#define CODE_SEG(...)
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
Type
Definition: Type.h:7
unsigned char BOOLEAN
Definition: actypes.h:127
#define ATA_MAX_DEVICE
Definition: ata_shared.h:15
#define ATA_MIN_BUFFER_ALIGNMENT
Definition: ata_shared.h:30
BOOLEAN AtapInPEMode
Definition: atapi.c:15
NTSTATUS AtaPnpQueryPnpDeviceState(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:555
NTSTATUS AtaPnpRepeatRequest(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp, _In_opt_ PDEVICE_CAPABILITIES DeviceCapabilities)
Definition: atapi.c:445
VOID AtaSetPortRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ PCWSTR KeyName, _In_ ULONG KeyValue)
Definition: atapi.c:236
VOID AtaSetRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ UCHAR TargetId, _In_ PCWSTR KeyName, _In_ ULONG KeyValue)
Definition: atapi.c:180
PCSTR DeviceType
Definition: atapi.c:20
UNICODE_STRING AtapDriverRegistryPath
Definition: atapi.c:14
NTSTATUS NTAPI AtaDispatchCreateClose(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: atapi.c:274
VOID AtaGetRegistryKey(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ UCHAR TargetId, _In_ PCWSTR KeyName, _Out_ PULONG KeyValue, _In_ ULONG DefaultValue)
Definition: atapi.c:113
static BOOLEAN AtaInPEMode(VOID)
Definition: atapi.c:663
NTSTATUS AtaOpenRegistryKey(_Out_ PHANDLE KeyHandle, _In_ HANDLE RootKey, _In_ PUNICODE_STRING KeyName, _In_ BOOLEAN Create)
Definition: atapi.c:75
static ATAPORT_PAGED_DATA const struct @1160 AtapGenericDeviceNames[]
VOID AtaPnpInitializeCommonExtension(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PDEVICE_OBJECT SelfDeviceObject, _In_ ULONG Flags)
Definition: atapi.c:572
PCSTR PeripheralId
Definition: atapi.c:22
static VOID AtaCreateIdeDirectory(VOID)
Definition: atapi.c:692
PCSTR AtaTypeCodeToName(_In_ PATAPORT_DEVICE_EXTENSION DevExt, _In_ DEVICE_TYPE_NAME Type)
Definition: atapi.c:42
NTSTATUS AtaPnpQueryInterface(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ const GUID *Guid, _Out_ PVOID Interface, _In_ ULONG Version, _In_ ULONG Size)
Definition: atapi.c:396
NTSTATUS AtaPnpQueryDeviceUsageNotification(_In_ PATAPORT_COMMON_EXTENSION CommonExt, _In_ PIRP Irp)
Definition: atapi.c:503
PCSTR GenericType
Definition: atapi.c:21
#define DO_IS_FDO
Definition: atapi.h:430
#define DECLARE_PAGED_WSTRING(v, n)
Definition: atapi.h:162
SLIST_HEADER AtapCompletionQueueList
Definition: scsi.c:14
#define ATAPORT_PAGED_DATA
Definition: atapi.h:153
#define IS_FDO(p)
Definition: atapi.h:173
KDEFERRED_ROUTINE AtaStorageNotificationlDpc
Definition: atapi.h:655
KDEFERRED_ROUTINE AtaReqCompletionDpc
Definition: atapi.h:939
DRIVER_UNLOAD AtaUnload
Definition: atapi.h:649
FORCEINLINE ATA_SCSI_ADDRESS AtaMarshallScsiAddress(_In_ ULONG PathId, _In_ ULONG TargetId, _In_ ULONG Lun)
Definition: atapi.h:585
#define DEVICE_IS_SUPER_FLOPPY
Definition: atapi.h:89
DECLSPEC_NOINLINE_FROM_PAGED PATAPORT_DEVICE_EXTENSION AtaFdoFindDeviceByPath(_In_ PATAPORT_CHANNEL_EXTENSION ChanExt, _In_ ATA_SCSI_ADDRESS AtaScsiAddress, _In_ PVOID ReferenceTag)
Definition: fdo.c:614
DEVICE_TYPE_NAME
Definition: atapi.h:565
@ GetGenericType
Definition: atapi.h:567
@ GetPeripheralId
Definition: atapi.h:568
@ GetDeviceType
Definition: atapi.h:566
IO_WORKITEM_ROUTINE AtaStorageNotificationWorker
Definition: atapi.h:654
DRIVER_ADD_DEVICE AtaAddChannel
Definition: atapi.h:646
#define DECLARE_PAGED_UNICODE_STRING(Variable, Str)
Definition: atapi.h:155
KDPC AtapCompletionDpc
Definition: scsi.c:15
#define ATAPORT_TAG
Definition: atapi.h:171
IO_COMPLETION_ROUTINE AtaPdoCompletionRoutine
Definition: atapi.h:859
LONG NTSTATUS
Definition: precomp.h:26
@ Create
Definition: registry.c:563
#define ERR(fmt,...)
Definition: precomp.h:57
PDEVICE_OBJECT PhysicalDeviceObject
Definition: btrfs_drv.h:1157
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define IRP_MJ_PNP
Definition: cdrw_usr.h:52
Definition: bufpool.h:45
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR _In_ UCHAR TargetId
Definition: classpnp.h:1314
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_NOT_SUPPORTED
Definition: d3dkmdt.h:48
#define STATUS_DEVICE_REMOVED
Definition: d3dkmdt.h:39
#define STATUS_NOT_IMPLEMENTED
Definition: d3dkmdt.h:42
NTSTATUS NTAPI AtaDispatchPower(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: dev_power.c:523
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
static const WCHAR Cleanup[]
Definition: register.c:80
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:712
DRIVER_INITIALIZE DriverEntry
Definition: condrv.c:21
#define L(x)
Definition: resources.c:13
#define __FUNCTION__
Definition: types.h:116
#define INFO
Definition: debug.h:89
NTSTATUS NTAPI AtaDispatchDeviceControl(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: ioctl.c:932
NTSTATUS NTAPI AtaDispatchWmi(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: wmi.c:175
#define PtrToUlong(u)
Definition: config.h:107
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define NonPagedPool
Definition: env_spec_w32.h:307
#define KeInitializeSpinLock(sl)
Definition: env_spec_w32.h:604
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h: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 i
Definition: glfuncs.h:248
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
Definition: irp.cpp:490
DeviceType
Definition: mmdrv.h:42
#define ASSERT(a)
Definition: mode.c:44
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define min(a, b)
Definition: monoChain.cc:55
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
Definition: mxum.h:159
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING _Out_ PNDIS_HANDLE KeyHandle
Definition: ndis.h:4715
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:56
_In_ PIOMMU_DEVICE_PATH _In_ PIOMMU_SVM_CAPABILITIES DeviceCapabilities
Definition: haltypes.h:1824
#define KernelMode
Definition: asm.h:38
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
@ KeyValuePartialInformation
Definition: nt_native.h:1185
#define KEY_ALL_ACCESS
Definition: nt_native.h:1044
#define KEY_READ
Definition: nt_native.h:1026
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
struct _KEY_VALUE_PARTIAL_INFORMATION KEY_VALUE_PARTIAL_INFORMATION
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define DIRECTORY_ALL_ACCESS
Definition: nt_native.h:1262
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1063
#define UNREACHABLE
#define UNICODE_NULL
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
@ NotificationEvent
static OUT PIO_STATUS_BLOCK IoStatusBlock
Definition: pipe.c:75
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:967
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1032
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
Definition: device.c:1297
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1252
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
Definition: device.c:1407
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:1069
#define IoCompleteRequest
Definition: irp.c:1240
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
Definition: irp.c:615
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
Definition: irp.c:881
BOOLEAN NTAPI IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1625
#define IoCallDriver
Definition: irp.c:1225
VOID NTAPI IoFreeIrp(IN PIRP Irp)
Definition: irp.c:1666
@ PowerSystemWorking
Definition: ntpoapi.h:36
@ PowerDeviceD0
Definition: ntpoapi.h:49
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
NTSTRSAFEVAPI RtlStringCbPrintfW(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
Definition: ntstrsafe.h:1173
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
NTSTATUS NTAPI IoOpenDeviceRegistryKey(IN PDEVICE_OBJECT DeviceObject, IN ULONG DevInstKeyType, IN ACCESS_MASK DesiredAccess, OUT PHANDLE DevInstRegKey)
Definition: pnpmgr.c:1621
VOID NTAPI IoInvalidateDeviceState(IN PDEVICE_OBJECT DeviceObject)
Definition: pnpmgr.c:1848
#define STORAGE_EVENT_NOTIFICATION_VERSION_V1
Definition: ntddstor.h:979
#define IOCTL_STORAGE_EVENT_NOTIFICATION
Definition: ntddstor.h:226
#define STORAGE_EVENT_ALL
Definition: ntddstor.h:984
#define FILE_DEVICE_CONTROLLER
Definition: winioctl.h:49
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
#define OBJ_PERMANENT
Definition: winternl.h:226
#define IRP_MJ_CLOSE
Definition: rdpdr.c:45
#define IRP_MJ_DEVICE_CONTROL
Definition: rdpdr.c:52
#define IRP_MJ_CREATE
Definition: rdpdr.c:44
#define REG_DWORD
Definition: sdbapi.c:615
static PMEMKEY RootKey
Definition: registry.c:55
#define STATUS_SUCCESS
Definition: shellext.h:65
static void Exit(void)
Definition: sock.c:1330
#define TRACE(s)
Definition: solgame.cpp:4
NTSTATUS NTAPI AtaDispatchPnp(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: pdo.c:644
NTSTATUS NTAPI AtaDispatchScsi(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: scsi.c:1771
_In_ PVOID Context
Definition: storport.h:2269
KSPIN_LOCK PdoListLock
Definition: atapi.h:445
PDEVICE_OBJECT Pdo
Definition: atapi.h:444
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:440
PDEVICE_OBJECT Self
Definition: atapi.h:432
PDEVICE_OBJECT LowerDeviceObject
Definition: atapi.h:423
IO_REMOVE_LOCK RemoveLock
Definition: atapi.h:434
ATAPORT_COMMON_EXTENSION Common
Definition: atapi.h:455
ULONG PortNumber
Definition: atapi.h:396
ULONG AlignmentRequirement
Definition: env_spec_w32.h:420
union _IO_STACK_LOCATION::@1696 Parameters
struct _IO_STACK_LOCATION::@4366::@4399 UsageNotification
struct _IO_STACK_LOCATION::@4366::@4393 DeviceCapabilities
struct _IO_STACK_LOCATION::@4366::@4392 QueryInterface
IO_STATUS_BLOCK IoStatus
Definition: ketypes.h:751
USHORT MaximumLength
Definition: env_spec_w32.h:370
static LARGE_INTEGER Counter
Definition: clock.c:43
#define max(a, b)
Definition: svc.c:63
#define STATUS_PENDING
Definition: telnetd.h:14
uint32_t * PULONG
Definition: typedefs.h:59
const uint16_t * PCWSTR
Definition: typedefs.h:57
unsigned char UCHAR
Definition: typedefs.h:53
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
const char * PCSTR
Definition: typedefs.h:52
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
UCHAR DefaultValue
Definition: via.c:137
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG _Out_ PULONG ResultLength
Definition: wdfdevice.h:3782
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2705
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
Definition: wdfdpc.h:112
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE Interface
Definition: wdffdo.h:465
_Must_inspect_result_ _In_ WDFDEVICE _In_ LPCGUID _Out_ PINTERFACE _In_ USHORT _In_ USHORT Version
Definition: wdffdo.h:469
_Must_inspect_result_ _In_ WDFOBJECT _In_ CONST GUID * Guid
Definition: wdfobject.h:762
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
Definition: wdfregistry.h:243
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
Definition: wdfworkitem.h:115
#define DeviceCapabilities
Definition: wingdi.h:4895
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
@ CriticalWorkQueue
Definition: extypes.h:189
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2695
#define IoAdjustPagingPathCount(_Count, _Increment)
#define PLUGPLAY_REGKEY_DEVICE
Definition: iofuncs.h:2786
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2764
#define IoInitializeRemoveLock(Lock, AllocateTag, MaxLockedMinutes, HighWatermark)
Definition: iofuncs.h:2833
#define IRP_MJ_SCSI
#define PNP_DEVICE_NOT_DISABLEABLE
Definition: iotypes.h:1006
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define IRP_MN_QUERY_INTERFACE
#define IRP_MJ_SYSTEM_CONTROL
* PDEVICE_CAPABILITIES
Definition: iotypes.h:965
#define IRP_MJ_POWER
@ DeviceUsageTypeHibernation
Definition: iotypes.h:1171
@ DeviceUsageTypeDumpFile
Definition: iotypes.h:1172
@ DeviceUsageTypePaging
Definition: iotypes.h:1170
@ Suspended
Definition: ketypes.h:472
@ Executive
Definition: ketypes.h:467
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
Definition: ketypes.h:740
_In_opt_ PVOID DeferredContext
Definition: ketypes.h:739
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
Definition: ketypes.h:741
#define ObDereferenceObject
Definition: obfuncs.h:203
#define NT_VERIFY(exp)
Definition: rtlfuncs.h:3304
FORCEINLINE VOID InitializeSListHead(_Out_ PSLIST_HEADER SListHead)
Definition: rtlfuncs.h:3368
#define const
Definition: zconf.h:233