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

driver.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/driver.c
00005  * PURPOSE:         KS Driver functions
00006  * PROGRAMMER:      Johannes Anderwald
00007  */
00008 
00009 #include "priv.h"
00010 
00011 /*
00012     @implemented
00013 */
00014 KSDDKAPI
00015 PKSDEVICE
00016 NTAPI
00017 KsGetDeviceForDeviceObject(
00018     IN PDEVICE_OBJECT FunctionalDeviceObject)
00019 {
00020     PDEVICE_EXTENSION DeviceExtension;
00021 
00022     /* get device extension */
00023     DeviceExtension = (PDEVICE_EXTENSION)FunctionalDeviceObject->DeviceExtension;
00024 
00025     return &DeviceExtension->DeviceHeader->KsDevice;
00026 }
00027 
00028 /*
00029     @implemented
00030 */
00031 KSDDKAPI
00032 PKSDEVICE
00033 NTAPI
00034 KsGetDevice(
00035     IN PVOID Object)
00036 {
00037     PKSBASIC_HEADER BasicHeader = (PKSBASIC_HEADER)((ULONG_PTR)Object - sizeof(KSBASIC_HEADER));
00038 
00039     DPRINT("KsGetDevice Type %lu KsDevice %p\n", BasicHeader->Type, BasicHeader->KsDevice);
00040 
00041     ASSERT(BasicHeader->Type == KsObjectTypeFilterFactory || BasicHeader->Type == KsObjectTypeFilter || BasicHeader->Type == KsObjectTypePin);
00042     ASSERT(BasicHeader->KsDevice);
00043     ASSERT(BasicHeader->KsDevice->Descriptor);
00044     ASSERT(BasicHeader->KsDevice->Bag);
00045     ASSERT(BasicHeader->KsDevice->Context);
00046     ASSERT(BasicHeader->KsDevice->FunctionalDeviceObject);
00047     ASSERT(BasicHeader->KsDevice->PhysicalDeviceObject);
00048     ASSERT(BasicHeader->KsDevice->NextDeviceObject);
00049     ASSERT(BasicHeader->KsDevice->Started);
00050     ASSERT(BasicHeader->KsDevice->SystemPowerState == PowerSystemWorking);
00051     ASSERT(BasicHeader->KsDevice->DevicePowerState == PowerDeviceD0);
00052 
00053     return BasicHeader->KsDevice;
00054 }
00055 
00056 /*
00057     @implemented
00058 */
00059 KSDDKAPI
00060 NTSTATUS
00061 NTAPI
00062 KsCreateDevice(
00063     IN  PDRIVER_OBJECT DriverObject,
00064     IN  PDEVICE_OBJECT PhysicalDeviceObject,
00065     IN  const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL,
00066     IN  ULONG ExtensionSize OPTIONAL,
00067     OUT PKSDEVICE* Device OPTIONAL)
00068 {
00069     NTSTATUS Status = STATUS_DEVICE_REMOVED;
00070     PDEVICE_OBJECT FunctionalDeviceObject= NULL;
00071     PDEVICE_OBJECT OldHighestDeviceObject;
00072     if (!ExtensionSize)
00073         ExtensionSize = sizeof(KSDEVICE_HEADER);
00074 
00075     DPRINT("KsCreateDevice Descriptor %p ExtensionSize %lu\n", Descriptor, ExtensionSize);
00076 
00077     Status = IoCreateDevice(DriverObject, ExtensionSize, NULL, FILE_DEVICE_KS, FILE_DEVICE_SECURE_OPEN, FALSE, &FunctionalDeviceObject);
00078     if (!NT_SUCCESS(Status))
00079         return Status;
00080 
00081     OldHighestDeviceObject = IoAttachDeviceToDeviceStack(FunctionalDeviceObject, PhysicalDeviceObject);
00082     if (OldHighestDeviceObject)
00083     {
00084         Status = KsInitializeDevice(FunctionalDeviceObject, PhysicalDeviceObject, OldHighestDeviceObject, Descriptor);
00085     }
00086     else
00087     {
00088         Status = STATUS_DEVICE_REMOVED;
00089     }
00090 
00091     /* check if all succeeded */
00092     if (!NT_SUCCESS(Status))
00093     {
00094         if (OldHighestDeviceObject)
00095             IoDetachDevice(OldHighestDeviceObject);
00096 
00097         IoDeleteDevice(FunctionalDeviceObject);
00098         return Status;
00099     }
00100 
00101     /* set device flags */
00102     FunctionalDeviceObject->Flags |= DO_DIRECT_IO | DO_POWER_PAGABLE;
00103     FunctionalDeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
00104 
00105     if (Device)
00106     {
00107         /* get PKSDEVICE struct */
00108         *Device = KsGetDeviceForDeviceObject(FunctionalDeviceObject);
00109 
00110         if (ExtensionSize > sizeof(KSDEVICE_HEADER))
00111         {
00112             /* caller needs a device extension */
00113             (*Device)->Context = (PVOID)((ULONG_PTR)FunctionalDeviceObject->DeviceExtension + sizeof(KSDEVICE_HEADER));
00114         }
00115     }
00116 
00117     return Status;
00118 }
00119 
00120 /*
00121     @implemented
00122 */
00123 KSDDKAPI
00124 NTSTATUS
00125 NTAPI
00126 KsAddDevice(
00127     IN  PDRIVER_OBJECT DriverObject,
00128     IN  PDEVICE_OBJECT PhysicalDeviceObject)
00129 {
00130     PKS_DRIVER_EXTENSION DriverObjectExtension;
00131     const KSDEVICE_DESCRIPTOR *Descriptor = NULL;
00132 
00133     /* get stored driver object extension */
00134 
00135     DriverObjectExtension = IoGetDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver);
00136 
00137     if (DriverObjectExtension)
00138     {
00139         /* get the stored descriptor see KsInitializeDriver */
00140         Descriptor = DriverObjectExtension->Descriptor;
00141     }
00142 
00143     return KsCreateDevice(DriverObject, PhysicalDeviceObject, Descriptor, 0, NULL);
00144 }
00145 
00146 /*
00147     @implemented
00148 */
00149 KSDDKAPI
00150 NTSTATUS
00151 NTAPI
00152 KsInitializeDriver(
00153     IN PDRIVER_OBJECT  DriverObject,
00154     IN PUNICODE_STRING  RegistryPath,
00155     IN const KSDEVICE_DESCRIPTOR  *Descriptor OPTIONAL
00156 )
00157 {
00158     PKS_DRIVER_EXTENSION DriverObjectExtension;
00159     NTSTATUS Status = STATUS_SUCCESS;
00160 
00161     DPRINT("KsInitializeDriver\n");
00162 
00163     if (Descriptor)
00164     {
00165         Status = IoAllocateDriverObjectExtension(DriverObject, (PVOID)KsInitializeDriver, sizeof(KS_DRIVER_EXTENSION), (PVOID*)&DriverObjectExtension);
00166         if (NT_SUCCESS(Status))
00167         {
00168             DriverObjectExtension->Descriptor = Descriptor;
00169         }
00170     }
00171 
00172     /* sanity check */
00173     ASSERT(Status == STATUS_SUCCESS);
00174 
00175     if (!NT_SUCCESS(Status))
00176         return Status;
00177 
00178     /* Setting our IRP handlers */
00179     DriverObject->MajorFunction[IRP_MJ_CREATE] = IKsDevice_Create;
00180     DriverObject->MajorFunction[IRP_MJ_PNP] = IKsDevice_Pnp;
00181     DriverObject->MajorFunction[IRP_MJ_POWER] = IKsDevice_Power;
00182     DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = KsDefaultForwardIrp;
00183 
00184     /* The driver unload routine */
00185     DriverObject->DriverUnload = KsNullDriverUnload;
00186 
00187     /* The driver-supplied AddDevice */
00188     DriverObject->DriverExtension->AddDevice = KsAddDevice;
00189 
00190     /* KS handles these */
00191     DPRINT1("KsInitializeDriver Setting KS function handlers\n");
00192     KsSetMajorFunctionHandler(DriverObject, IRP_MJ_CLOSE);
00193     KsSetMajorFunctionHandler(DriverObject, IRP_MJ_DEVICE_CONTROL);
00194 
00195 
00196     return STATUS_SUCCESS;
00197 }

Generated on Fri May 25 2012 04:17:01 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.