ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

misc.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.