Author: janderwald
Date: Mon Aug 10 23:10:03 2009
New Revision: 42603
URL:
http://svn.reactos.org/svn/reactos?rev=42603&view=rev
Log:
- Implement swenum
Added:
trunk/reactos/drivers/ksfilter/swenum/precomp.h (with props)
trunk/reactos/drivers/ksfilter/swenum/swenum.c (with props)
trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild (with props)
Modified:
trunk/reactos/drivers/ksfilter/directory.rbuild
Modified: trunk/reactos/drivers/ksfilter/directory.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/directory…
==============================================================================
--- trunk/reactos/drivers/ksfilter/directory.rbuild [iso-8859-1] (original)
+++ trunk/reactos/drivers/ksfilter/directory.rbuild [iso-8859-1] Mon Aug 10 23:10:03 2009
@@ -4,5 +4,8 @@
<directory name="ks">
<xi:include href="ks/ks.rbuild" />
</directory>
+ <directory name="swenum">
+ <xi:include href="swenum/swenum.rbuild" />
+ </directory>
</group>
Added: trunk/reactos/drivers/ksfilter/swenum/precomp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/swenum/pr…
==============================================================================
--- trunk/reactos/drivers/ksfilter/swenum/precomp.h (added)
+++ trunk/reactos/drivers/ksfilter/swenum/precomp.h [iso-8859-1] Mon Aug 10 23:10:03 2009
@@ -1,0 +1,12 @@
+#ifndef PRECOMP_H__
+#define PRECOMP_H__
+
+#include <ntddk.h>
+#include <ks.h>
+#include <swenum.h>
+#include <debug.h>
+
+
+
+
+#endif
Propchange: trunk/reactos/drivers/ksfilter/swenum/precomp.h
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/ksfilter/swenum/swenum.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/swenum/sw…
==============================================================================
--- trunk/reactos/drivers/ksfilter/swenum/swenum.c (added)
+++ trunk/reactos/drivers/ksfilter/swenum/swenum.c [iso-8859-1] Mon Aug 10 23:10:03 2009
@@ -1,0 +1,309 @@
+/*
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS Kernel Streaming
+ * FILE: drivers/ksfilter/swenum/swenum.c
+ * PURPOSE: KS Allocator functions
+ * PROGRAMMER: Johannes Anderwald
+ */
+
+
+#include "precomp.h"
+
+const GUID KSMEDIUMSETID_Standard = {0x4747B320L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28,
0xDB, 0x04, 0xC1, 0x00, 0x00}};
+
+
+NTSTATUS
+NTAPI
+SwDispatchPower(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+
+ UNIMPLEMENTED;
+
+ /* just complete the irp */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+
+ /* complete the irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ /* done */
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS
+NTAPI
+SwDispatchPnp(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ BOOLEAN ChildDevice;
+ PIO_STACK_LOCATION IoStack;
+ PDEVICE_OBJECT PnpDeviceObject = NULL;
+
+ /* check if the device object is a child device */
+ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* let ks handle it */
+ Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* invalid request or not supported */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* get bus enum pnp object */
+ Status = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
+
+ /* check for success */
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed to get pnp object */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+ }
+
+ /* sanity check */
+ ASSERT(PnpDeviceObject);
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->MinorFunction == IRP_MN_REMOVE_DEVICE)
+ {
+ /* delete the device */
+ IoDeleteDevice(DeviceObject);
+ }
+
+ /* skip current location */
+ IoSkipCurrentIrpStackLocation(Irp);
+ /* call the pnp device object */
+ return IoCallDriver(PnpDeviceObject, Irp);
+}
+
+NTSTATUS
+NTAPI
+SwDispatchSystemControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ BOOLEAN ChildDevice;
+ PDEVICE_OBJECT PnpDeviceObject;
+
+ /* check if the device object is a child device */
+ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
+
+ /* check for success */
+ if (NT_SUCCESS(Status))
+ {
+ if (!ChildDevice)
+ {
+ /* bus devices dont support internal requests */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+ }
+
+ /* get bus enum pnp object */
+ Status = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
+
+ /* check for success */
+ if (NT_SUCCESS(Status))
+ {
+ /* skip current location */
+ IoSkipCurrentIrpStackLocation(Irp);
+ /* call the pnp device object */
+ return IoCallDriver(PnpDeviceObject, Irp);
+ }
+
+ }
+
+ /* complete the request */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ return Status;
+
+}
+
+NTSTATUS
+NTAPI
+SwDispatchDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION IoStack;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ /* get current stack location */
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+
+ if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_SWENUM_INSTALL_INTERFACE)
+ {
+ /* install interface */
+ Status = KsInstallBusEnumInterface(Irp);
+ }
+ else if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_SWENUM_REMOVE_INTERFACE)
+ {
+ /* remove interface */
+ Status = KsRemoveBusEnumInterface(Irp);
+ }
+ else if (IoStack->Parameters.DeviceIoControl.IoControlCode ==
IOCTL_SWENUM_GET_BUS_ID)
+ {
+ /* get bus id */
+ return KsGetBusEnumIdentifier(Irp);
+ }
+
+ /* store result */
+ Irp->IoStatus.Status = Status;
+
+ /* complete irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ /* done */
+ return Status;
+}
+
+
+NTSTATUS
+NTAPI
+SwDispatchCreate(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ NTSTATUS Status;
+ BOOLEAN ChildDevice;
+
+ /* check if the device object is a child device */
+ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
+
+ /* check for success */
+ if (NT_SUCCESS(Status))
+ {
+ if (ChildDevice)
+ {
+ /* child devices cant create devices */
+ Irp->IoStatus.Status = STATUS_OBJECT_NAME_NOT_FOUND;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_OBJECT_NAME_NOT_FOUND;
+ }
+ /* perform the create request */
+ Status = KsServiceBusEnumCreateRequest(DeviceObject, Irp);
+ }
+
+ /* check the irp is pending */
+ if (Status != STATUS_PENDING)
+ {
+ /* irp is ok to complete */
+ Irp->IoStatus.Status = Status;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+NTAPI
+SwDispatchClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ /* just complete the irp */
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+
+ /* complete the irp */
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ /* done */
+ return STATUS_SUCCESS;
+
+}
+
+NTSTATUS
+NTAPI
+SwAddDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT PhysicalDeviceObject)
+{
+ NTSTATUS Status;
+ PDEVICE_OBJECT FunctionalDeviceObject;
+
+ /* create the device */
+ Status = IoCreateDevice(DriverObject, sizeof(KSDEVICE_HEADER), NULL,
FILE_DEVICE_BUS_EXTENDER, 0, FALSE, &FunctionalDeviceObject);
+
+ if (!NT_SUCCESS(Status))
+ {
+ /* failed */
+ return Status;
+ }
+
+ /* create the bus enum object */
+ Status = KsCreateBusEnumObject(L"SW", FunctionalDeviceObject,
PhysicalDeviceObject, NULL, &KSMEDIUMSETID_Standard, L"Devices");
+
+ /* check for success */
+ if (NT_SUCCESS(Status))
+ {
+ /* set device flags */
+ FunctionalDeviceObject->Flags |= DO_POWER_PAGABLE;
+ FunctionalDeviceObject->Flags &= ~ DO_DEVICE_INITIALIZING;
+ }
+ else
+ {
+ /* failed to create bus enum object */
+ IoDeleteDevice(FunctionalDeviceObject);
+ }
+
+ /* done */
+ return Status;
+}
+
+VOID
+NTAPI
+SwUnload(
+ IN PDRIVER_OBJECT DriverObject)
+{
+ /* nop */
+}
+
+NTSTATUS
+NTAPI
+DriverEntry(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPathName)
+{
+
+ /* setup add device routine */
+ DriverObject->DriverExtension->AddDevice = SwAddDevice;
+
+ /* setup unload routine */
+ DriverObject->DriverUnload = SwUnload;
+
+ /* misc irp handling routines */
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = SwDispatchCreate;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = SwDispatchClose;
+ DriverObject->MajorFunction[IRP_MJ_PNP] = SwDispatchPnp;
+ DriverObject->MajorFunction[IRP_MJ_POWER] = SwDispatchPower;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = SwDispatchDeviceControl;
+ DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = SwDispatchSystemControl;
+
+
+ return STATUS_SUCCESS;
+}
+
Propchange: trunk/reactos/drivers/ksfilter/swenum/swenum.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/ksfilter/swenum/sw…
==============================================================================
--- trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild (added)
+++ trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild [iso-8859-1] Mon Aug 10 23:10:03
2009
@@ -1,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
+<module name="swenum" type="kernelmodedriver"
installbase="system32/drivers" installname="swenum.sys">
+ <library>ntoskrnl</library>
+ <library>ks</library>
+ <file>swenum.c</file>
+</module>
Propchange: trunk/reactos/drivers/ksfilter/swenum/swenum.rbuild
------------------------------------------------------------------------------
svn:eol-style = native