Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenmisc.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel Streaming 00004 * FILE: drivers/ksfilter/ks/misc.c 00005 * PURPOSE: KS Allocator functions 00006 * PROGRAMMER: Johannes Anderwald 00007 */ 00008 00009 00010 #include "priv.h" 00011 00012 VOID 00013 CompleteRequest( 00014 PIRP Irp, 00015 CCHAR PriorityBoost) 00016 { 00017 DPRINT("Completing IRP %p Status %x\n", Irp, Irp->IoStatus.Status); 00018 00019 ASSERT(Irp->IoStatus.Status != STATUS_PENDING); 00020 00021 00022 IoCompleteRequest(Irp, PriorityBoost); 00023 } 00024 00025 PVOID 00026 AllocateItem( 00027 IN POOL_TYPE PoolType, 00028 IN SIZE_T NumberOfBytes) 00029 { 00030 PVOID Item = ExAllocatePool(PoolType, NumberOfBytes); 00031 if (!Item) 00032 return Item; 00033 00034 RtlZeroMemory(Item, NumberOfBytes); 00035 return Item; 00036 } 00037 00038 VOID 00039 FreeItem( 00040 IN PVOID Item) 00041 { 00042 ExFreePool(Item); 00043 } 00044 00045 NTSTATUS 00046 NTAPI 00047 KspForwardIrpSynchronousCompletion( 00048 IN PDEVICE_OBJECT DeviceObject, 00049 IN PIRP Irp, 00050 IN PVOID Context) 00051 { 00052 if (Irp->PendingReturned == TRUE) 00053 { 00054 KeSetEvent ((PKEVENT) Context, IO_NO_INCREMENT, FALSE); 00055 } 00056 return STATUS_MORE_PROCESSING_REQUIRED; 00057 } 00058 00059 00060 NTSTATUS 00061 KspForwardIrpSynchronous( 00062 IN PDEVICE_OBJECT DeviceObject, 00063 IN PIRP Irp) 00064 { 00065 KEVENT Event; 00066 NTSTATUS Status; 00067 PDEVICE_EXTENSION DeviceExtension; 00068 PKSIDEVICE_HEADER DeviceHeader; 00069 00070 ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); 00071 00072 /* get device extension */ 00073 DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; 00074 /* get device header */ 00075 DeviceHeader = DeviceExtension->DeviceHeader; 00076 00077 /* initialize the notification event */ 00078 KeInitializeEvent(&Event, NotificationEvent, FALSE); 00079 00080 IoCopyCurrentIrpStackLocationToNext(Irp); 00081 00082 IoSetCompletionRoutine(Irp, KspForwardIrpSynchronousCompletion, (PVOID)&Event, TRUE, TRUE, TRUE); 00083 00084 /* now call the driver */ 00085 Status = IoCallDriver(DeviceHeader->KsDevice.NextDeviceObject, Irp); 00086 /* did the request complete yet */ 00087 if (Status == STATUS_PENDING) 00088 { 00089 /* not yet, lets wait a bit */ 00090 KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); 00091 Status = Irp->IoStatus.Status; 00092 } 00093 return Status; 00094 } 00095 00096 NTSTATUS 00097 KspCopyCreateRequest( 00098 IN PIRP Irp, 00099 IN LPWSTR ObjectClass, 00100 IN OUT PULONG Size, 00101 OUT PVOID * Result) 00102 { 00103 PIO_STACK_LOCATION IoStack; 00104 ULONG ObjectLength, ParametersLength; 00105 PVOID Buffer; 00106 00107 /* get current irp stack */ 00108 IoStack = IoGetCurrentIrpStackLocation(Irp); 00109 00110 /* get object class length */ 00111 ObjectLength = (wcslen(ObjectClass) + 1) * sizeof(WCHAR); 00112 00113 /* check for minium length requirement */ 00114 if (ObjectLength + *Size > IoStack->FileObject->FileName.MaximumLength) 00115 return STATUS_UNSUCCESSFUL; 00116 00117 /* extract parameters length */ 00118 ParametersLength = IoStack->FileObject->FileName.MaximumLength - ObjectLength; 00119 00120 /* allocate buffer */ 00121 Buffer = AllocateItem(NonPagedPool, ParametersLength); 00122 if (!Buffer) 00123 return STATUS_INSUFFICIENT_RESOURCES; 00124 00125 /* copy parameters */ 00126 RtlMoveMemory(Buffer, &IoStack->FileObject->FileName.Buffer[ObjectLength / sizeof(WCHAR)], ParametersLength); 00127 00128 /* store result */ 00129 *Result = Buffer; 00130 *Size = ParametersLength; 00131 00132 return STATUS_SUCCESS; 00133 } 00134 00135 /* 00136 @implemented 00137 */ 00138 KSDDKAPI 00139 PVOID 00140 NTAPI 00141 KsGetObjectFromFileObject( 00142 IN PFILE_OBJECT FileObject) 00143 { 00144 PKSIOBJECT_HEADER ObjectHeader; 00145 00146 /* get object header */ 00147 ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; 00148 00149 /* return associated object */ 00150 return ObjectHeader->ObjectType; 00151 } 00152 00153 /* 00154 @implemented 00155 */ 00156 KSDDKAPI 00157 KSOBJECTTYPE 00158 NTAPI 00159 KsGetObjectTypeFromFileObject( 00160 IN PFILE_OBJECT FileObject) 00161 { 00162 PKSIOBJECT_HEADER ObjectHeader; 00163 00164 /* get object header */ 00165 ObjectHeader = (PKSIOBJECT_HEADER)FileObject->FsContext2; 00166 /* return type */ 00167 return ObjectHeader->Type; 00168 } 00169 00170 /* 00171 @implemented 00172 */ 00173 KSOBJECTTYPE 00174 NTAPI 00175 KsGetObjectTypeFromIrp( 00176 IN PIRP Irp) 00177 { 00178 PKSIOBJECT_HEADER ObjectHeader; 00179 PIO_STACK_LOCATION IoStack; 00180 00181 /* get current irp stack */ 00182 IoStack = IoGetCurrentIrpStackLocation(Irp); 00183 /* get object header */ 00184 ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext2; 00185 /* return type */ 00186 return ObjectHeader->Type; 00187 } 00188 00189 /* 00190 @implemented 00191 */ 00192 PUNKNOWN 00193 NTAPI 00194 KsGetOuterUnknown( 00195 IN PVOID Object) 00196 { 00197 PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); 00198 00199 /* sanity check */ 00200 ASSERT(BasicHeader->Type == KsObjectTypeDevice || BasicHeader->Type == KsObjectTypeFilterFactory || 00201 BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin); 00202 00203 /* return objects outer unknown */ 00204 return BasicHeader->OuterUnknown; 00205 } 00206 00207 /* 00208 @implemented 00209 */ 00210 KSDDKAPI 00211 PVOID 00212 NTAPI 00213 KsGetParent( 00214 IN PVOID Object) 00215 { 00216 PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER)); 00217 /* sanity check */ 00218 ASSERT(BasicHeader->Parent.KsDevice != NULL); 00219 /* return object type */ 00220 return (PVOID)BasicHeader->Parent.KsDevice; 00221 } 00222 00223 Generated on Sat May 26 2012 04:15:48 for ReactOS by
1.7.6.1
|