2 ReactOS Kernel Streaming
11 KSDDKAPI NTSTATUS NTAPI
14 OUT KSRESET
* ResetValue
)
17 return STATUS_UNSUCCESSFUL
;
24 KsAddIrpToCancelableQueue(
25 IN OUT PLIST_ENTRY QueueHead
,
26 IN PKSPIN_LOCK SpinLock
,
28 IN KSLIST_ENTRY_LOCATION ListLocation
,
29 IN PDRIVER_CANCEL DriverCancel OPTIONAL
)
37 KSDDKAPI NTSTATUS NTAPI
38 KsAddObjectCreateItemToObjectHeader(
39 IN KSOBJECT_HEADER Header
,
40 IN PDRIVER_DISPATCH Create
,
42 IN PWCHAR ObjectClass
,
43 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
46 return STATUS_UNSUCCESSFUL
;
56 KsAddObjectCreateItemToDeviceHeader(
57 IN KSDEVICE_HEADER DevHeader
,
58 IN PDRIVER_DISPATCH Create
,
60 IN PWCHAR ObjectClass
,
61 IN PSECURITY_DESCRIPTOR SecurityDescriptor
)
63 PKSIDEVICE_HEADER Header
;
64 PKSOBJECT_CREATE_ITEM ItemList
;
65 PKSIOBJECT_HEADER ObjectList
;
67 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
70 return STATUS_INVALID_PARAMETER_1
;
73 return STATUS_INVALID_PARAMETER_2
;
76 return STATUS_INVALID_PARAMETER_4
;
78 if (Header
->FreeIndex
>= Header
->MaxItems
&& Header
->ItemsListProvided
)
79 return STATUS_ALLOTTED_SPACE_EXCEEDED
;
81 if (Header
->FreeIndex
>= Header
->MaxItems
)
83 ItemList
= ExAllocatePoolWithTag(NonPagedPool
, sizeof(KSOBJECT_CREATE_ITEM
) * (Header
->MaxItems
+ 1), TAG('H','D','S','K'));
85 return STATUS_INSUFFICIENT_RESOURCES
;
87 ObjectList
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIOBJECT_HEADER
) * (Header
->MaxItems
+ 1), TAG('H','D','S','K'));
90 ExFreePoolWithTag(ItemList
, TAG('H','D','S','K'));
91 return STATUS_INSUFFICIENT_RESOURCES
;
94 RtlMoveMemory(ItemList
, Header
->ItemsList
, Header
->MaxItems
* sizeof(KSOBJECT_CREATE_ITEM
));
95 ExFreePoolWithTag(Header
->ItemsList
, TAG('H','D','S','K'));
97 RtlMoveMemory(ObjectList
, Header
->ObjectList
, Header
->MaxItems
* sizeof(KSIOBJECT_HEADER
));
98 ExFreePoolWithTag(Header
->ObjectList
, TAG('H','D','S','K'));
101 Header
->ItemsList
= ItemList
;
104 if (Header
->FreeIndex
< Header
->MaxItems
)
106 Header
->ItemsList
[Header
->FreeIndex
].Context
= Context
;
107 Header
->ItemsList
[Header
->FreeIndex
].Create
= Create
;
108 Header
->ItemsList
[Header
->FreeIndex
].Flags
= 0;
109 RtlInitUnicodeString(&Header
->ItemsList
[Header
->FreeIndex
].ObjectClass
, ObjectClass
);
110 Header
->ItemsList
[Header
->FreeIndex
].SecurityDescriptor
= SecurityDescriptor
;
113 return STATUS_SUCCESS
;
116 return STATUS_ALLOTTED_SPACE_EXCEEDED
;
122 KSDDKAPI NTSTATUS NTAPI
123 KsAllocateDeviceHeader(
124 OUT KSDEVICE_HEADER
* OutHeader
,
126 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
)
128 PKSIDEVICE_HEADER Header
;
131 return STATUS_INVALID_PARAMETER
;
133 Header
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIDEVICE_HEADER
), TAG('H','D','S','K'));
136 return STATUS_INSUFFICIENT_RESOURCES
;
138 RtlZeroMemory(Header
, sizeof(KSIDEVICE_HEADER
));
142 Header
->ObjectList
= ExAllocatePoolWithTag(PagedPool
, sizeof(KSIOBJECT_HEADER
) * ItemsCount
, TAG('H','D','S','K'));
143 if (!Header
->ObjectList
)
145 ExFreePoolWithTag(Header
, TAG('H','D','S','K'));
146 return STATUS_INSUFFICIENT_RESOURCES
;
148 RtlZeroMemory(Header
->ObjectList
, sizeof(KSIOBJECT_HEADER
) * ItemsCount
);
151 Header
->MaxItems
= ItemsCount
;
152 Header
->FreeIndex
= 0;
153 Header
->ItemsList
= ItemsList
;
154 Header
->ItemsListProvided
= (ItemsList
!= NULL
) ? TRUE
: FALSE
;
158 return STATUS_SUCCESS
;
164 http://www.osronline.com/DDKx/stream/ksfunc_3sc3.htm
169 KsAllocateObjectCreateItem(
170 IN KSDEVICE_HEADER DevHeader
,
171 IN PKSOBJECT_CREATE_ITEM CreateItem
,
172 IN BOOLEAN AllocateEntry
,
173 IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL
)
175 PKSIDEVICE_HEADER Header
;
177 Header
= (PKSIDEVICE_HEADER
)DevHeader
;
180 return STATUS_INVALID_PARAMETER_1
;
183 return STATUS_INVALID_PARAMETER_2
;
186 //handle ItemFreeCallback
190 return STATUS_UNSUCCESSFUL
;
199 IN KSDEVICE_HEADER Header
)
204 /* TODO: Free content first */
206 ExFreePoolWithTag(Header
, TAG('H','D','S','K'));
212 KSDDKAPI NTSTATUS NTAPI
216 OUT PVOID
* ExtraBuffer
)
219 return STATUS_UNSUCCESSFUL
;
225 Initialize the required file context header.
226 Allocates KSOBJECT_HEADER structure.
227 Irp is an IRP_MJ_CREATE structure.
228 Driver must allocate KSDISPATCH_TABLE and initialize it first.
230 http://www.osronline.com/DDKx/stream/ksfunc_0u2b.htm
235 KsAllocateObjectHeader(
236 OUT KSOBJECT_HEADER
*Header
,
238 IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL
,
240 IN KSDISPATCH_TABLE
* Table
)
242 PKSIDEVICE_HEADER DeviceHeader
;
246 return STATUS_INVALID_PARAMETER_1
;
249 return STATUS_INVALID_PARAMETER_4
;
251 DeviceHeader
= (PKSIDEVICE_HEADER
)Irp
->Tail
.Overlay
.DriverContext
[3];
252 Index
= (ULONG
)Irp
->Tail
.Overlay
.DriverContext
[2];
254 RtlCopyMemory(&DeviceHeader
->ObjectList
[Index
].DispatchTable
, Table
, sizeof(KSDISPATCH_TABLE
));
255 DeviceHeader
->ObjectList
[Index
].CreateItem
= ItemsList
;
256 DeviceHeader
->ObjectList
[Index
].Initialized
= TRUE
;
258 *Header
= &DeviceHeader
->ObjectList
[Index
];
259 return STATUS_SUCCESS
;
270 ExFreePoolWithTag(Header
, TAG('H','O','S','K'));
282 IN OUT PLIST_ENTRY QueueHead
,
283 IN PKSPIN_LOCK SpinLock
)
293 IN PDEVICE_OBJECT DeviceObject
,
302 KSDDKAPI NTSTATUS NTAPI
303 KsDefaultDeviceIoCompletion(
304 IN PDEVICE_OBJECT DeviceObject
,
308 return STATUS_UNSUCCESSFUL
;
314 KSDDKAPI BOOLEAN NTAPI
315 KsDispatchFastIoDeviceControlFailure(
316 IN PFILE_OBJECT FileObject
,
318 IN PVOID InputBuffer OPTIONAL
,
319 IN ULONG InputBufferLength
,
320 OUT PVOID OutputBuffer OPTIONAL
,
321 IN ULONG OutputBufferLength
,
322 IN ULONG IoControlCode
,
323 OUT PIO_STATUS_BLOCK IoStatus
,
324 IN PDEVICE_OBJECT DeviceObject
) /* always return false */
332 KSDDKAPI BOOLEAN NTAPI
333 KsDispatchFastReadFailure(
334 IN PFILE_OBJECT FileObject
,
335 IN PLARGE_INTEGER FileOffset
,
340 OUT PIO_STATUS_BLOCK IoStatus
,
341 IN PDEVICE_OBJECT DeviceObject
) /* always return false */
347 Used in dispatch table entries that aren't handled and need to return
348 STATUS_INVALID_DEVICE_REQUEST.
350 KSDDKAPI NTSTATUS NTAPI
351 KsDispatchInvalidDeviceRequest(
352 IN PDEVICE_OBJECT DeviceObject
,
355 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
356 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
358 return STATUS_INVALID_DEVICE_REQUEST
;
364 KSDDKAPI NTSTATUS NTAPI
365 KsDispatchSpecificMethod(
367 IN PFNKSHANDLER Handler
)
370 return STATUS_UNSUCCESSFUL
;
376 KSDDKAPI NTSTATUS NTAPI
377 KsDispatchSpecificProperty(
379 IN PFNKSHANDLER Handler
)
382 return STATUS_UNSUCCESSFUL
;
388 KSDDKAPI NTSTATUS NTAPI
389 KsForwardAndCatchIrp(
390 IN PDEVICE_OBJECT DeviceObject
,
392 IN PFILE_OBJECT FileObject
,
393 IN KSSTACK_USE StackUse
)
396 return STATUS_UNSUCCESSFUL
;
402 KSDDKAPI NTSTATUS NTAPI
405 IN PFILE_OBJECT FileObject
,
406 IN BOOLEAN ReuseStackLocation
)
409 return STATUS_UNSUCCESSFUL
;
415 KSDDKAPI NTSTATUS NTAPI
416 KsGetChildCreateParameter(
418 OUT PVOID
* CreateParameter
)
421 return STATUS_UNSUCCESSFUL
;
427 KSDDKAPI NTSTATUS NTAPI
428 KsMoveIrpsOnCancelableQueue(
429 IN OUT PLIST_ENTRY SourceList
,
430 IN PKSPIN_LOCK SourceLock
,
431 IN OUT PLIST_ENTRY DestinationList
,
432 IN PKSPIN_LOCK DestinationLock OPTIONAL
,
433 IN KSLIST_ENTRY_LOCATION ListLocation
,
434 IN PFNKSIRPLISTCALLBACK ListCallback
,
438 return STATUS_UNSUCCESSFUL
;
444 KSDDKAPI NTSTATUS NTAPI
451 return STATUS_UNSUCCESSFUL
;
457 KSDDKAPI NTSTATUS NTAPI
458 KsQueryInformationFile(
459 IN PFILE_OBJECT FileObject
,
460 OUT PVOID FileInformation
,
462 IN FILE_INFORMATION_CLASS FileInformationClass
)
465 return STATUS_UNSUCCESSFUL
;
471 KSDDKAPI ACCESS_MASK NTAPI
472 KsQueryObjectAccessMask(
473 IN KSOBJECT_HEADER Header
)
476 return STATUS_UNSUCCESSFUL
;
482 KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI
483 KsQueryObjectCreateItem(
484 IN KSOBJECT_HEADER Header
)
487 /* return STATUS_UNSUCCESSFUL; */
494 KSDDKAPI NTSTATUS NTAPI
496 IN PFILE_OBJECT FileObject
,
497 IN PKEVENT Event OPTIONAL
,
498 IN PVOID PortContext OPTIONAL
,
499 OUT PIO_STATUS_BLOCK IoStatusBlock
,
502 IN ULONG Key OPTIONAL
,
503 IN KPROCESSOR_MODE RequestorMode
)
506 return STATUS_UNSUCCESSFUL
;
513 KsReleaseIrpOnCancelableQueue(
515 IN PDRIVER_CANCEL DriverCancel OPTIONAL
)
524 KsRemoveIrpFromCancelableQueue(
525 IN OUT PLIST_ENTRY QueueHead
,
526 IN PKSPIN_LOCK SpinLock
,
527 IN KSLIST_ENTRY_LOCATION ListLocation
,
528 IN KSIRP_REMOVAL_OPERATION RemovalOperation
)
532 /*return STATUS_UNSUCCESSFUL; */
539 KsRemoveSpecificIrpFromCancelableQueue(
548 KSDDKAPI NTSTATUS NTAPI
549 KsSetInformationFile(
550 IN PFILE_OBJECT FileObject
,
551 IN PVOID FileInformation
,
553 IN FILE_INFORMATION_CLASS FileInformationClass
)
556 return STATUS_UNSUCCESSFUL
;
564 IN PDEVICE_OBJECT DeviceObject
,
567 PIO_STACK_LOCATION IoStack
;
568 PDEVICE_EXTENSION DeviceExtension
;
569 PKSIDEVICE_HEADER DeviceHeader
;
573 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
575 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
576 DeviceHeader
= DeviceExtension
->DeviceHeader
;
578 DPRINT1("KS / Create\n");
580 /* first call all create handlers */
581 for(Index
= 0; Index
< DeviceHeader
->FreeIndex
; Index
++)
583 KSCREATE_ITEM_IRP_STORAGE(Irp
) = &DeviceHeader
->ItemsList
[Index
];
585 Irp
->Tail
.Overlay
.DriverContext
[3] = (PVOID
)DeviceHeader
;
586 Irp
->Tail
.Overlay
.DriverContext
[2] = (PVOID
)Index
;
588 DeviceHeader
->ObjectList
[Index
].Initialized
= FALSE
;
589 Status
= DeviceHeader
->ItemsList
[Index
].Create(DeviceObject
, Irp
);
590 if (!NT_SUCCESS(Status
))
592 DeviceHeader
->ObjectList
[Index
].Initialized
= FALSE
;
597 return STATUS_SUCCESS
;
603 IN PDEVICE_OBJECT DeviceObject
,
606 PIO_STACK_LOCATION IoStack
;
607 PDEVICE_EXTENSION DeviceExtension
;
608 PKSIDEVICE_HEADER DeviceHeader
;
612 DPRINT1("KS / CLOSE\n");
614 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
616 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
617 DeviceHeader
= DeviceExtension
->DeviceHeader
;
619 for(Index
= 0; Index
< DeviceHeader
->FreeIndex
; Index
++)
621 if (DeviceHeader
->ObjectList
[Index
].Initialized
)
623 Status
= DeviceHeader
->ObjectList
->DispatchTable
.Close(DeviceObject
, Irp
);
624 DeviceHeader
->ObjectList
[Index
].Initialized
= FALSE
;
628 return STATUS_SUCCESS
;
634 IN PDEVICE_OBJECT DeviceObject
,
637 PIO_STACK_LOCATION IoStack
;
638 PDEVICE_EXTENSION DeviceExtension
;
639 PKSIDEVICE_HEADER DeviceHeader
;
643 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
645 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
646 DeviceHeader
= DeviceExtension
->DeviceHeader
;
648 DPRINT1("KS / DeviceControl NumDevices %x\n", DeviceHeader
->FreeIndex
);
650 for(Index
= 0; Index
< DeviceHeader
->FreeIndex
; Index
++)
652 if (DeviceHeader
->ObjectList
[Index
].Initialized
)
654 DPRINT1("Calling DeviceIoControl\n");
655 Status
= DeviceHeader
->ObjectList
->DispatchTable
.DeviceIoControl(DeviceObject
, Irp
);
659 return STATUS_SUCCESS
;
665 IN PDEVICE_OBJECT DeviceObject
,
668 PIO_STACK_LOCATION IoStack
;
669 PDEVICE_EXTENSION DeviceExtension
;
670 PKSIDEVICE_HEADER DeviceHeader
;
674 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
676 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
677 DeviceHeader
= DeviceExtension
->DeviceHeader
;
679 DPRINT1("KS / Read\n");
681 for(Index
= 0; Index
< DeviceHeader
->FreeIndex
; Index
++)
683 if (DeviceHeader
->ObjectList
[Index
].Initialized
)
685 Status
= DeviceHeader
->ObjectList
->DispatchTable
.Read(DeviceObject
, Irp
);
689 return STATUS_SUCCESS
;
695 IN PDEVICE_OBJECT DeviceObject
,
698 PIO_STACK_LOCATION IoStack
;
699 PDEVICE_EXTENSION DeviceExtension
;
700 PKSIDEVICE_HEADER DeviceHeader
;
704 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
706 DeviceExtension
= (PDEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
707 DeviceHeader
= DeviceExtension
->DeviceHeader
;
709 DPRINT1("KS / Write\n");
711 for(Index
= 0; Index
< DeviceHeader
->FreeIndex
; Index
++)
713 if (DeviceHeader
->ObjectList
[Index
].Initialized
)
715 Status
= DeviceHeader
->ObjectList
->DispatchTable
.Write(DeviceObject
, Irp
);
718 return STATUS_SUCCESS
;
724 IN PDEVICE_OBJECT DeviceObject
,
727 DPRINT1("KS / FlushBuffers\n");
728 return STATUS_UNSUCCESSFUL
;
734 IN PDEVICE_OBJECT DeviceObject
,
737 DPRINT1("KS / QuerySecurity\n");
738 return STATUS_UNSUCCESSFUL
;
744 IN PDEVICE_OBJECT DeviceObject
,
747 DPRINT1("KS / SetSecurity\n");
748 return STATUS_UNSUCCESSFUL
;
754 KSDDKAPI NTSTATUS NTAPI
755 KsSetMajorFunctionHandler(
756 IN PDRIVER_OBJECT DriverObject
,
757 IN ULONG MajorFunction
)
760 Sets a DriverObject's major function handler to point to an internal
761 function we implement.
763 TODO: Deal with KSDISPATCH_FASTIO
766 switch ( MajorFunction
)
769 DriverObject
->MajorFunction
[MajorFunction
] = KsCreate
;
772 DriverObject
->MajorFunction
[MajorFunction
] = KsClose
;
774 case IRP_MJ_DEVICE_CONTROL
:
775 DriverObject
->MajorFunction
[MajorFunction
] = KsDeviceControl
;
778 DriverObject
->MajorFunction
[MajorFunction
] = KsRead
;
781 DriverObject
->MajorFunction
[MajorFunction
] = KsWrite
;
783 case IRP_MJ_FLUSH_BUFFERS
:
784 DriverObject
->MajorFunction
[MajorFunction
] = KsFlushBuffers
;
786 case IRP_MJ_QUERY_SECURITY
:
787 DriverObject
->MajorFunction
[MajorFunction
] = KsQuerySecurity
;
789 case IRP_MJ_SET_SECURITY
:
790 DriverObject
->MajorFunction
[MajorFunction
] = KsSetSecurity
;
794 return STATUS_INVALID_PARAMETER
; /* is this right? */
797 return STATUS_SUCCESS
;
807 IN PDEVICE_OBJECT DeviceObject
,
810 PIO_STACK_LOCATION IoStack
;
812 /* Calls a dispatch routine corresponding to the function code of the IRP */
814 First we need to get the dispatch table. An opaque header is pointed to by
815 FsContext. The first element points to this table. This table is the key
816 to dispatching the IRP correctly.
819 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
820 DPRINT1("KsDispatchIrp %x\n", IoStack
->MajorFunction
);
822 switch (IoStack
->MajorFunction
)
825 return KsCreate(DeviceObject
, Irp
);
827 return KsClose(DeviceObject
, Irp
);
829 case IRP_MJ_DEVICE_CONTROL
:
830 return KsDeviceControl(DeviceObject
, Irp
);
833 return KsRead(DeviceObject
, Irp
);
836 return KsWrite(DeviceObject
, Irp
);
838 case IRP_MJ_FLUSH_BUFFERS
:
839 return KsFlushBuffers(DeviceObject
, Irp
);
841 case IRP_MJ_QUERY_SECURITY
:
842 return KsQuerySecurity(DeviceObject
, Irp
);
844 case IRP_MJ_SET_SECURITY
:
845 return KsSetSecurity(DeviceObject
, Irp
);
848 return STATUS_INVALID_PARAMETER
; /* is this right? */
856 KSDDKAPI NTSTATUS NTAPI
858 IN PFILE_OBJECT FileObject
,
859 IN PKEVENT Event OPTIONAL
,
860 IN PVOID PortContext OPTIONAL
,
861 IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL
,
862 IN PVOID CompletionContext OPTIONAL
,
863 IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL
,
864 OUT PIO_STATUS_BLOCK IoStatusBlock
,
865 IN OUT PVOID StreamHeaders
,
868 IN KPROCESSOR_MODE RequestorMode
)
871 return STATUS_UNSUCCESSFUL
;
877 KSDDKAPI NTSTATUS NTAPI
879 IN PFILE_OBJECT FileObject
,
880 IN PKEVENT Event OPTIONAL
,
881 IN PVOID PortContext OPTIONAL
,
882 OUT PIO_STATUS_BLOCK IoStatusBlock
,
885 IN ULONG Key OPTIONAL
,
886 IN KPROCESSOR_MODE RequestorMode
)
889 return STATUS_UNSUCCESSFUL
;
895 KSDDKAPI NTSTATUS NTAPI
897 IN PDEVICE_OBJECT DeviceObject
,
901 return STATUS_UNSUCCESSFUL
;