2 ReactOS Kernel Streaming
11 KSDDKAPI NTSTATUS NTAPI
14 OUT KSRESET
* ResetValue
)
17 return STATUS_UNSUCCESSFUL
;
26 KsAddIrpToCancelableQueue(
27 IN OUT PLIST_ENTRY QueueHead
,
28 IN PKSPIN_LOCK SpinLock
,
30 IN KSLIST_ENTRY_LOCATION ListLocation
,
31 IN PDRIVER_CANCEL DriverCancel OPTIONAL
)
35 if (!QueueHead
|| !SpinLock
|| !Irp
)
38 Entry
= ExAllocatePool(NonPagedPool
, sizeof(QUEUE_ENTRY
));
43 // setup cancel routine
48 if (ListLocation
== KsListEntryTail
)
49 ExInterlockedInsertTailList(QueueHead
, &Entry
->Entry
, SpinLock
);
51 ExInterlockedInsertHeadList(QueueHead
, &Entry
->Entry
, SpinLock
);
58 KSDDKAPI NTSTATUS NTAPI
59 KsAddObjectCreateItemToObjectHeader(
60 IN KSOBJECT_HEADER Header
,
61 IN PDRIVER_DISPATCH Create
,
63 IN PWCHAR ObjectClass
,
64 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
67 return STATUS_UNSUCCESSFUL
;
77 KsAddObjectCreateItemToDeviceHeader(
78 IN KSDEVICE_HEADER DevHeader
,
79 IN PDRIVER_DISPATCH Create
,
81 IN PWCHAR ObjectClass
,
82 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
84 PKSIDEVICE_HEADER Header
;
85 ULONG FreeIndex
, Index
;
87 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
89 DPRINT1("KsAddObjectCreateItemToDeviceHeader entered\n");
91 /* check if a device header has been provided */
93 return STATUS_INVALID_PARAMETER_1
;
95 /* check if a create item has been provided */
97 return STATUS_INVALID_PARAMETER_2
;
99 /* check if a object class has been provided */
101 return STATUS_INVALID_PARAMETER_4
;
103 FreeIndex
= (ULONG
)-1;
104 /* now scan the list and check for a free item */
105 for(Index
= 0; Index
< Header
->MaxItems
; Index
++)
107 if (!Header
->ItemList
[Index
].bCreated
)
109 if (FreeIndex
== (ULONG
)-1)
114 else if (!wcsicmp(ObjectClass
, Header
->ItemList
[Index
].CreateItem
.ObjectClass
.Buffer
))
116 /* the same object class already exists */
117 return STATUS_OBJECT_NAME_COLLISION
;
120 /* found a free index */
121 if (FreeIndex
== (ULONG
)-1)
123 /* allocate a new device entry */
124 PDEVICE_ITEM Item
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(DEVICE_ITEM
) * (Header
->MaxItems
+ 1), TAG_DEVICE_HEADER
);
126 return STATUS_INSUFFICIENT_RESOURCES
;
128 RtlMoveMemory(Item
, Header
->ItemList
, Header
->MaxItems
* sizeof(DEVICE_ITEM
));
129 ExFreePoolWithTag(Header
->ItemList
, TAG_DEVICE_HEADER
);
131 Header
->ItemList
= Item
;
132 FreeIndex
= Header
->MaxItems
;
136 /* store the new item */
137 Header
->ItemList
[FreeIndex
].bCreated
= TRUE
;
138 Header
->ItemList
[FreeIndex
].CreateItem
.Create
= Create
;
139 Header
->ItemList
[FreeIndex
].CreateItem
.Context
= Context
;
140 RtlInitUnicodeString(&Header
->ItemList
[FreeIndex
].CreateItem
.ObjectClass
, ObjectClass
);
141 Header
->ItemList
[FreeIndex
].CreateItem
.SecurityDescriptor
= SecurityDescriptor
;
142 Header
->ItemList
[FreeIndex
].CreateItem
.Flags
= 0;
143 return STATUS_SUCCESS
;
152 KsAllocateDeviceHeader(
153 OUT KSDEVICE_HEADER
* OutHeader
,
155 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
)
158 PKSIDEVICE_HEADER Header
;
161 return STATUS_INVALID_PARAMETER
;
163 /* allocate a device header */
164 Header
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIDEVICE_HEADER
), TAG_DEVICE_HEADER
);
166 /* check for success */
168 return STATUS_INSUFFICIENT_RESOURCES
;
170 /* clear all memory */
171 RtlZeroMemory(Header
, sizeof(KSIDEVICE_HEADER
));
173 /* initialize spin lock */
174 KeInitializeSpinLock(&Header
->ItemListLock
);
176 /* are there any create items provided */
177 if (ItemsCount
&& ItemsList
)
179 /* allocate space for device item list */
180 Header
->ItemList
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(DEVICE_ITEM
) * ItemsCount
, TAG_DEVICE_HEADER
);
181 if (!Header
->ItemList
)
183 ExFreePoolWithTag(Header
, TAG_DEVICE_HEADER
);
184 return STATUS_INSUFFICIENT_RESOURCES
;
186 RtlZeroMemory(Header
->ItemList
, sizeof(DEVICE_ITEM
) * ItemsCount
);
188 for(Index
= 0; Index
< ItemsCount
; Index
++)
190 /* copy provided create items */
191 RtlMoveMemory(&Header
->ItemList
[Index
], &ItemsList
[Index
], sizeof(KSOBJECT_CREATE_ITEM
));
193 Header
->MaxItems
= ItemsCount
;
199 return STATUS_SUCCESS
;
205 http://www.osronline.com/DDKx/stream/ksfunc_3sc3.htm
210 KsAllocateObjectCreateItem(
211 IN KSDEVICE_HEADER DevHeader
,
212 IN PKSOBJECT_CREATE_ITEM CreateItem
,
213 IN BOOLEAN AllocateEntry
,
214 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
)
216 PKSIDEVICE_HEADER Header
;
218 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
221 return STATUS_INVALID_PARAMETER_1
;
224 return STATUS_INVALID_PARAMETER_2
;
227 //handle ItemFreeCallback
229 if (AllocateEntry
&& ItemFreeCallback
)
230 DPRINT1("Ignoring ItemFreeCallback\n");
232 return KsAddObjectCreateItemToDeviceHeader(DevHeader
, CreateItem
->Create
, CreateItem
->Context
, CreateItem
->ObjectClass
.Buffer
, CreateItem
->SecurityDescriptor
);
243 IN KSDEVICE_HEADER DevHeader
)
245 PKSIDEVICE_HEADER Header
;
247 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
252 ExFreePoolWithTag(Header
->ItemList
, TAG_DEVICE_HEADER
);
253 ExFreePoolWithTag(Header
, TAG_DEVICE_HEADER
);
259 KSDDKAPI NTSTATUS NTAPI
263 OUT PVOID
* ExtraBuffer
)
266 return STATUS_UNSUCCESSFUL
;
272 Initialize the required file context header.
273 Allocates KSOBJECT_HEADER structure.
274 Irp is an IRP_MJ_CREATE structure.
275 Driver must allocate KSDISPATCH_TABLE and initialize it first.
277 http://www.osronline.com/DDKx/stream/ksfunc_0u2b.htm
282 KsAllocateObjectHeader(
283 OUT KSOBJECT_HEADER
*Header
,
285 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
,
287 IN KSDISPATCH_TABLE
* Table
)
289 PIO_STACK_LOCATION IoStack
;
290 PDEVICE_EXTENSION DeviceExtension
;
291 PKSIDEVICE_HEADER DeviceHeader
;
292 PKSIOBJECT_HEADER ObjectHeader
;
293 WCHAR ObjectClass
[50];
296 return STATUS_INVALID_PARAMETER_1
;
299 return STATUS_INVALID_PARAMETER_4
;
302 return STATUS_INVALID_PARAMETER_5
;
304 /* get current stack location */
305 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
306 /* get device extension */
307 DeviceExtension
= (PDEVICE_EXTENSION
)IoStack
->DeviceObject
->DeviceExtension
;
308 /* get device header */
309 DeviceHeader
= DeviceExtension
->DeviceHeader
;
311 ObjectClass
[0] = L
'\0';
312 /* check for an file object */
313 if (IoStack
->FileObject
!= NULL
)
315 /* validate the file name */
316 if (IoStack
->FileObject
->FileName
.Length
>= 38)
318 RtlMoveMemory(ObjectClass
, IoStack
->FileObject
->FileName
.Buffer
, 38 * sizeof(WCHAR
));
319 ObjectClass
[38] = L
'\0';
320 DPRINT1("ObjectClass %S\n", ObjectClass
);
323 /* allocate the object header */
324 ObjectHeader
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KSIOBJECT_HEADER
), TAG_DEVICE_HEADER
);
326 return STATUS_INSUFFICIENT_RESOURCES
;
328 /* initialize object header */
329 RtlZeroMemory(ObjectHeader
, sizeof(KSIOBJECT_HEADER
));
331 /* do we have a name */
334 ObjectHeader
->ObjectClass
= ExAllocatePoolWithTag(NonPagedPool
, 40 * sizeof(WCHAR
), TAG_DEVICE_HEADER
);
335 if (ObjectHeader
->ObjectClass
)
337 wcscpy(ObjectHeader
->ObjectClass
, ObjectClass
);
341 /* copy dispatch table */
342 RtlCopyMemory(&ObjectHeader
->DispatchTable
, Table
, sizeof(KSDISPATCH_TABLE
));
343 /* store create items */
344 if (ItemsCount
&& ItemsList
)
346 ObjectHeader
->ItemCount
= ItemsCount
;
347 ObjectHeader
->CreateItem
= ItemsList
;
350 /* was the request for a pin/clock/node */
351 if (IoStack
->FileObject
)
353 /* store the object in the file object */
354 ASSERT(IoStack
->FileObject
->FsContext
== NULL
);
355 IoStack
->FileObject
->FsContext
= ObjectHeader
;
359 /* the object header is for device */
360 ASSERT(DeviceHeader
->DeviceIndex
< DeviceHeader
->MaxItems
);
361 DeviceHeader
->ItemList
[DeviceHeader
->DeviceIndex
].ObjectHeader
= ObjectHeader
;
365 *Header
= ObjectHeader
;
368 DPRINT1("KsAllocateObjectHeader ObjectClass %S FileObject %p, ObjectHeader %p\n", ObjectClass
, IoStack
->FileObject
, ObjectHeader
);
370 return STATUS_SUCCESS
;
392 IN OUT PLIST_ENTRY QueueHead
,
393 IN PKSPIN_LOCK SpinLock
)
403 IN PDEVICE_OBJECT DeviceObject
,
412 KSDDKAPI NTSTATUS NTAPI
413 KsDefaultDeviceIoCompletion(
414 IN PDEVICE_OBJECT DeviceObject
,
418 return STATUS_UNSUCCESSFUL
;
424 KSDDKAPI BOOLEAN NTAPI
425 KsDispatchFastIoDeviceControlFailure(
426 IN PFILE_OBJECT FileObject
,
428 IN PVOID InputBuffer OPTIONAL
,
429 IN ULONG InputBufferLength
,
430 OUT PVOID OutputBuffer OPTIONAL
,
431 IN ULONG OutputBufferLength
,
432 IN ULONG IoControlCode
,
433 OUT PIO_STATUS_BLOCK IoStatus
,
434 IN PDEVICE_OBJECT DeviceObject
) /* always return false */
442 KSDDKAPI BOOLEAN NTAPI
443 KsDispatchFastReadFailure(
444 IN PFILE_OBJECT FileObject
,
445 IN PLARGE_INTEGER FileOffset
,
450 OUT PIO_STATUS_BLOCK IoStatus
,
451 IN PDEVICE_OBJECT DeviceObject
) /* always return false */
457 Used in dispatch table entries that aren't handled and need to return
458 STATUS_INVALID_DEVICE_REQUEST.
460 KSDDKAPI NTSTATUS NTAPI
461 KsDispatchInvalidDeviceRequest(
462 IN PDEVICE_OBJECT DeviceObject
,
465 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
466 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
468 return STATUS_INVALID_DEVICE_REQUEST
;
474 KSDDKAPI NTSTATUS NTAPI
475 KsDispatchSpecificMethod(
477 IN PFNKSHANDLER Handler
)
480 return STATUS_UNSUCCESSFUL
;
486 KSDDKAPI NTSTATUS NTAPI
487 KsDispatchSpecificProperty(
489 IN PFNKSHANDLER Handler
)
492 return STATUS_UNSUCCESSFUL
;
498 KSDDKAPI NTSTATUS NTAPI
499 KsForwardAndCatchIrp(
500 IN PDEVICE_OBJECT DeviceObject
,
502 IN PFILE_OBJECT FileObject
,
503 IN KSSTACK_USE StackUse
)
506 return STATUS_UNSUCCESSFUL
;
512 KSDDKAPI NTSTATUS NTAPI
515 IN PFILE_OBJECT FileObject
,
516 IN BOOLEAN ReuseStackLocation
)
519 return STATUS_UNSUCCESSFUL
;
525 KSDDKAPI NTSTATUS NTAPI
526 KsGetChildCreateParameter(
528 OUT PVOID
* CreateParameter
)
531 return STATUS_UNSUCCESSFUL
;
537 KSDDKAPI NTSTATUS NTAPI
538 KsMoveIrpsOnCancelableQueue(
539 IN OUT PLIST_ENTRY SourceList
,
540 IN PKSPIN_LOCK SourceLock
,
541 IN OUT PLIST_ENTRY DestinationList
,
542 IN PKSPIN_LOCK DestinationLock OPTIONAL
,
543 IN KSLIST_ENTRY_LOCATION ListLocation
,
544 IN PFNKSIRPLISTCALLBACK ListCallback
,
548 return STATUS_UNSUCCESSFUL
;
554 KSDDKAPI NTSTATUS NTAPI
561 return STATUS_UNSUCCESSFUL
;
567 KSDDKAPI NTSTATUS NTAPI
568 KsQueryInformationFile(
569 IN PFILE_OBJECT FileObject
,
570 OUT PVOID FileInformation
,
572 IN FILE_INFORMATION_CLASS FileInformationClass
)
575 return STATUS_UNSUCCESSFUL
;
581 KSDDKAPI ACCESS_MASK NTAPI
582 KsQueryObjectAccessMask(
583 IN KSOBJECT_HEADER Header
)
586 return STATUS_UNSUCCESSFUL
;
592 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
593 KsQueryObjectCreateItem(
594 IN KSOBJECT_HEADER Header
)
597 /* return STATUS_UNSUCCESSFUL; */
604 KSDDKAPI NTSTATUS NTAPI
606 IN PFILE_OBJECT FileObject
,
607 IN PKEVENT Event OPTIONAL
,
608 IN PVOID PortContext OPTIONAL
,
609 OUT PIO_STATUS_BLOCK IoStatusBlock
,
612 IN ULONG Key OPTIONAL
,
613 IN KPROCESSOR_MODE RequestorMode
)
616 return STATUS_UNSUCCESSFUL
;
623 KsReleaseIrpOnCancelableQueue(
625 IN PDRIVER_CANCEL DriverCancel OPTIONAL
)
636 KsRemoveIrpFromCancelableQueue(
637 IN OUT PLIST_ENTRY QueueHead
,
638 IN PKSPIN_LOCK SpinLock
,
639 IN KSLIST_ENTRY_LOCATION ListLocation
,
640 IN KSIRP_REMOVAL_OPERATION RemovalOperation
)
642 PQUEUE_ENTRY Entry
= NULL
;
646 if (!QueueHead
|| !SpinLock
)
649 if (ListLocation
!= KsListEntryTail
&& ListLocation
!= KsListEntryHead
)
652 if (RemovalOperation
!= KsAcquireOnly
&& RemovalOperation
!= KsAcquireAndRemove
)
655 KeAcquireSpinLock(SpinLock
, &OldIrql
);
657 if (!IsListEmpty(QueueHead
))
659 if (RemovalOperation
== KsAcquireOnly
)
661 if (ListLocation
== KsListEntryHead
)
662 Entry
= (PQUEUE_ENTRY
)QueueHead
->Flink
;
664 Entry
= (PQUEUE_ENTRY
)QueueHead
->Blink
;
666 else if (RemovalOperation
== KsAcquireAndRemove
)
668 if (ListLocation
== KsListEntryTail
)
669 Entry
= (PQUEUE_ENTRY
)RemoveTailList(QueueHead
);
671 Entry
= (PQUEUE_ENTRY
)RemoveHeadList(QueueHead
);
674 KeReleaseSpinLock(SpinLock
, OldIrql
);
681 if (RemovalOperation
== KsAcquireAndRemove
)
691 KsRemoveSpecificIrpFromCancelableQueue(
700 KSDDKAPI NTSTATUS NTAPI
701 KsSetInformationFile(
702 IN PFILE_OBJECT FileObject
,
703 IN PVOID FileInformation
,
705 IN FILE_INFORMATION_CLASS FileInformationClass
)
708 return STATUS_UNSUCCESSFUL
;
716 IN PDEVICE_OBJECT DeviceObject
,
719 PIO_STACK_LOCATION IoStack
;
720 PDEVICE_EXTENSION DeviceExtension
;
721 PKSIDEVICE_HEADER DeviceHeader
;
723 NTSTATUS Status
= STATUS_SUCCESS
;
726 DPRINT1("KS / CREATE\n");
727 /* get current stack location */
728 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
729 /* get device extension */
730 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
731 /* get device header */
732 DeviceHeader
= DeviceExtension
->DeviceHeader
;
734 /* acquire list lock */
735 KeAcquireSpinLock(&DeviceHeader
->ItemListLock
, &OldLevel
);
736 /* loop all device items */
737 for(Index
= 0; Index
< DeviceHeader
->MaxItems
; Index
++)
739 if (DeviceHeader
->ItemList
[Index
].bCreated
&& DeviceHeader
->ItemList
[Index
].ObjectHeader
== NULL
)
741 DeviceHeader
->DeviceIndex
= Index
;
742 /* set object create item */
743 KSCREATE_ITEM_IRP_STORAGE(Irp
) = &DeviceHeader
->ItemList
[Index
].CreateItem
;
744 Status
= DeviceHeader
->ItemList
[Index
].CreateItem
.Create(DeviceObject
, Irp
);
749 KeReleaseSpinLock(&DeviceHeader
->ItemListLock
, OldLevel
);
756 IN PDEVICE_OBJECT DeviceObject
,
759 PIO_STACK_LOCATION IoStack
;
760 PKSIOBJECT_HEADER ObjectHeader
;
762 /* get current stack location */
763 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
765 DPRINT1("KS / CLOSE\n");
767 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
769 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
771 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
772 return ObjectHeader
->DispatchTable
.Close(DeviceObject
, Irp
);
776 DPRINT1("Expected Object Header\n");
777 return STATUS_SUCCESS
;
784 IN PDEVICE_OBJECT DeviceObject
,
787 PIO_STACK_LOCATION IoStack
;
788 PKSIOBJECT_HEADER ObjectHeader
;
790 /* get current stack location */
791 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
793 DPRINT1("KS / DeviceControl\n");
794 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
796 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
798 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
799 return ObjectHeader
->DispatchTable
.DeviceIoControl(DeviceObject
, Irp
);
803 DPRINT1("Expected Object Header\n");
804 KeBugCheckEx(0, 0, 0, 0, 0);
805 return STATUS_SUCCESS
;
812 IN PDEVICE_OBJECT DeviceObject
,
815 PIO_STACK_LOCATION IoStack
;
816 PKSIOBJECT_HEADER ObjectHeader
;
818 /* get current stack location */
819 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
821 DPRINT1("KS / Read\n");
822 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
824 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
826 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
827 return ObjectHeader
->DispatchTable
.Read(DeviceObject
, Irp
);
831 DPRINT1("Expected Object Header\n");
832 KeBugCheckEx(0, 0, 0, 0, 0);
833 return STATUS_SUCCESS
;
840 IN PDEVICE_OBJECT DeviceObject
,
843 PIO_STACK_LOCATION IoStack
;
844 PKSIOBJECT_HEADER ObjectHeader
;
846 /* get current stack location */
847 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
849 DPRINT1("KS / Write\n");
850 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
852 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
854 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
855 return ObjectHeader
->DispatchTable
.Write(DeviceObject
, Irp
);
859 DPRINT1("Expected Object Header\n");
860 KeBugCheckEx(0, 0, 0, 0, 0);
861 return STATUS_SUCCESS
;
868 IN PDEVICE_OBJECT DeviceObject
,
871 PIO_STACK_LOCATION IoStack
;
872 PKSIOBJECT_HEADER ObjectHeader
;
874 /* get current stack location */
875 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
877 DPRINT1("KS / FlushBuffers\n");
878 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
880 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
882 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
883 return ObjectHeader
->DispatchTable
.Flush(DeviceObject
, Irp
);
887 DPRINT1("Expected Object Header\n");
888 KeBugCheckEx(0, 0, 0, 0, 0);
889 return STATUS_SUCCESS
;
896 IN PDEVICE_OBJECT DeviceObject
,
899 PIO_STACK_LOCATION IoStack
;
900 PKSIOBJECT_HEADER ObjectHeader
;
902 /* get current stack location */
903 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
905 DPRINT1("KS / QuerySecurity\n");
906 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
908 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
910 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
911 return ObjectHeader
->DispatchTable
.QuerySecurity(DeviceObject
, Irp
);
915 DPRINT1("Expected Object Header\n");
916 KeBugCheckEx(0, 0, 0, 0, 0);
917 return STATUS_SUCCESS
;
924 IN PDEVICE_OBJECT DeviceObject
,
927 PIO_STACK_LOCATION IoStack
;
928 PKSIOBJECT_HEADER ObjectHeader
;
930 /* get current stack location */
931 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
933 DPRINT1("KS / SetSecurity\n");
934 if (IoStack
->FileObject
&& IoStack
->FileObject
->FsContext
)
936 ObjectHeader
= (PKSIOBJECT_HEADER
) IoStack
->FileObject
->FsContext
;
938 KSCREATE_ITEM_IRP_STORAGE(Irp
) = ObjectHeader
->CreateItem
;
939 return ObjectHeader
->DispatchTable
.SetSecurity(DeviceObject
, Irp
);
943 DPRINT1("Expected Object Header\n");
944 KeBugCheckEx(0, 0, 0, 0, 0);
945 return STATUS_SUCCESS
;
952 KSDDKAPI NTSTATUS NTAPI
953 KsSetMajorFunctionHandler(
954 IN PDRIVER_OBJECT DriverObject
,
955 IN ULONG MajorFunction
)
958 Sets a DriverObject's major function handler to point to an internal
959 function we implement.
961 TODO: Deal with KSDISPATCH_FASTIO
964 switch ( MajorFunction
)
967 DriverObject
->MajorFunction
[MajorFunction
] = KsCreate
;
970 DriverObject
->MajorFunction
[MajorFunction
] = KsClose
;
972 case IRP_MJ_DEVICE_CONTROL
:
973 DriverObject
->MajorFunction
[MajorFunction
] = KsDeviceControl
;
976 DriverObject
->MajorFunction
[MajorFunction
] = KsRead
;
979 DriverObject
->MajorFunction
[MajorFunction
] = KsWrite
;
981 case IRP_MJ_FLUSH_BUFFERS
:
982 DriverObject
->MajorFunction
[MajorFunction
] = KsFlushBuffers
;
984 case IRP_MJ_QUERY_SECURITY
:
985 DriverObject
->MajorFunction
[MajorFunction
] = KsQuerySecurity
;
987 case IRP_MJ_SET_SECURITY
:
988 DriverObject
->MajorFunction
[MajorFunction
] = KsSetSecurity
;
992 return STATUS_INVALID_PARAMETER
; /* is this right? */
995 return STATUS_SUCCESS
;
1005 IN PDEVICE_OBJECT DeviceObject
,
1008 PIO_STACK_LOCATION IoStack
;
1010 /* Calls a dispatch routine corresponding to the function code of the IRP */
1012 First we need to get the dispatch table. An opaque header is pointed to by
1013 FsContext. The first element points to this table. This table is the key
1014 to dispatching the IRP correctly.
1017 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
1018 DPRINT1("KsDispatchIrp %x\n", IoStack
->MajorFunction
);
1020 switch (IoStack
->MajorFunction
)
1023 return KsCreate(DeviceObject
, Irp
);
1025 return KsClose(DeviceObject
, Irp
);
1027 case IRP_MJ_DEVICE_CONTROL
:
1028 return KsDeviceControl(DeviceObject
, Irp
);
1031 return KsRead(DeviceObject
, Irp
);
1034 return KsWrite(DeviceObject
, Irp
);
1036 case IRP_MJ_FLUSH_BUFFERS
:
1037 return KsFlushBuffers(DeviceObject
, Irp
);
1039 case IRP_MJ_QUERY_SECURITY
:
1040 return KsQuerySecurity(DeviceObject
, Irp
);
1042 case IRP_MJ_SET_SECURITY
:
1043 return KsSetSecurity(DeviceObject
, Irp
);
1046 return STATUS_INVALID_PARAMETER
; /* is this right? */
1054 KSDDKAPI NTSTATUS NTAPI
1056 IN PFILE_OBJECT FileObject
,
1057 IN PKEVENT Event OPTIONAL
,
1058 IN PVOID PortContext OPTIONAL
,
1059 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
1060 IN PVOID CompletionContext OPTIONAL
,
1061 IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL
,
1062 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1063 IN OUT PVOID StreamHeaders
,
1066 IN KPROCESSOR_MODE RequestorMode
)
1069 return STATUS_UNSUCCESSFUL
;
1075 KSDDKAPI NTSTATUS NTAPI
1077 IN PFILE_OBJECT FileObject
,
1078 IN PKEVENT Event OPTIONAL
,
1079 IN PVOID PortContext OPTIONAL
,
1080 OUT PIO_STATUS_BLOCK IoStatusBlock
,
1083 IN ULONG Key OPTIONAL
,
1084 IN KPROCESSOR_MODE RequestorMode
)
1087 return STATUS_UNSUCCESSFUL
;
1093 KSDDKAPI NTSTATUS NTAPI
1094 KsDefaultForwardIrp(
1095 IN PDEVICE_OBJECT DeviceObject
,
1099 return STATUS_UNSUCCESSFUL
;