Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432/* * 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}};
NTSTATUSNTAPISwDispatchPower( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ NTSTATUS Status, PnpStatus; BOOLEAN ChildDevice; PIO_STACK_LOCATION IoStack; PDEVICE_OBJECT PnpDeviceObject = NULL;
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp);
/* check if the device object is a child device */ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
/* get bus enum pnp object */ PnpStatus = KsGetBusEnumPnpDeviceObject(DeviceObject, &PnpDeviceObject);
/* check for success */ if (!NT_SUCCESS(Status) || !NT_SUCCESS(PnpStatus)) { /* start next power irp */ PoStartNextPowerIrp(Irp);
/* just complete the irp */ Irp->IoStatus.Status = STATUS_SUCCESS;
/* complete the irp */ IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* done */ return STATUS_SUCCESS; }
if (IoStack->MinorFunction == IRP_MN_SET_POWER || IoStack->MinorFunction == IRP_MN_QUERY_POWER) { /* fake success */ Irp->IoStatus.Status = STATUS_SUCCESS; }
if (!ChildDevice) { /* forward to pnp device object */ PoStartNextPowerIrp(Irp);
/* skip current location */ IoSkipCurrentIrpStackLocation(Irp);
/* done */ return PoCallDriver(PnpDeviceObject, Irp); }
/* start next power irp */ PoStartNextPowerIrp(Irp);
/* just complete the irp */ Irp->IoStatus.Status = STATUS_SUCCESS;
/* complete the irp */ IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* done */ return STATUS_SUCCESS;}
NTSTATUSNTAPISwDispatchPnp( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ NTSTATUS Status; BOOLEAN ChildDevice; PIO_STACK_LOCATION IoStack; PDEVICE_OBJECT PnpDeviceObject = NULL;
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp);
/* 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; }
DPRINT("SwDispatchPnp ChildDevice %u Request %x\n", ChildDevice, IoStack->MinorFunction);
/* let ks handle it */ Status = KsServiceBusEnumPnpRequest(DeviceObject, Irp);
/* check if the request was for a pdo */ if (ChildDevice) { if (Status != STATUS_NOT_SUPPORTED) { /* store result */ Irp->IoStatus.Status = Status; }
/* complete request */ IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* done */ return Status; }
DPRINT("SwDispatchPnp KsServiceBusEnumPnpRequest Status %x\n", Status);
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);
DPRINT("SwDispatchPnp KsGetBusEnumPnpDeviceObject Status %x\n", Status);
/* check for success */ if (!NT_SUCCESS(Status)) { /* failed to get pnp object */ Irp->IoStatus.Status = STATUS_NOT_SUPPORTED; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_NOT_SUPPORTED; }
/* sanity check */ ASSERT(PnpDeviceObject);
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp);
if (IoStack->MinorFunction == IRP_MN_REMOVE_DEVICE) { /* delete the device */ IoDeleteDevice(DeviceObject); } else { if (IoStack->MinorFunction == IRP_MN_QUERY_RESOURCES || IoStack->MinorFunction == IRP_MN_QUERY_RESOURCE_REQUIREMENTS) { /* no resources required */ Irp->IoStatus.Information = 0; Irp->IoStatus.Status = STATUS_SUCCESS;
/* skip current location */ IoSkipCurrentIrpStackLocation(Irp);
/* call the pnp device object */ return IoCallDriver(PnpDeviceObject, Irp); }
if (IoStack->MajorFunction == IRP_MN_QUERY_PNP_DEVICE_STATE) { /* device cannot be disabled */ Irp->IoStatus.Information |= PNP_DEVICE_NOT_DISABLEABLE; Irp->IoStatus.Status = STATUS_SUCCESS;
/* skip current location */ IoSkipCurrentIrpStackLocation(Irp);
/* call the pnp device object */ return IoCallDriver(PnpDeviceObject, Irp); }
if (Status == STATUS_NOT_SUPPORTED) { /* 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;}
NTSTATUSNTAPISwDispatchSystemControl( 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;
}
NTSTATUSNTAPISwDispatchDeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ PIO_STACK_LOCATION IoStack; NTSTATUS Status;
/* get current stack location */ IoStack = IoGetCurrentIrpStackLocation(Irp);
if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_INSTALL_INTERFACE) { /* install interface */ Status = KsInstallBusEnumInterface(Irp); DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_INSTALL_INTERFACE %x\n", Status); } else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_REMOVE_INTERFACE) { /* remove interface */ Status = KsRemoveBusEnumInterface(Irp); DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_REMOVE_INTERFACE %x\n", Status);
} else if (IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_SWENUM_GET_BUS_ID) { /* get bus id */ Status = KsGetBusEnumIdentifier(Irp); DPRINT("SwDispatchDeviceControl IOCTL_SWENUM_GET_BUS_ID %x\n", Status); } else { DPRINT("SwDispatchDeviceControl Unknown IOCTL %x\n", IoStack->Parameters.DeviceIoControl.IoControlCode); Status = STATUS_INVALID_PARAMETER; }
/* store result */ Irp->IoStatus.Status = Status;
/* complete irp */ IoCompleteRequest(Irp, IO_NO_INCREMENT);
/* done */ return Status;}
NTSTATUSNTAPISwDispatchCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){ NTSTATUS Status; BOOLEAN ChildDevice;
/* check if the device object is a child device */ Status = KsIsBusEnumChildDevice(DeviceObject, &ChildDevice);
DPRINT("SwDispatchCreate %x\n", Status);
/* 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); DPRINT("SwDispatchCreate %x\n", Status); }
/* 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;}
NTSTATUSNTAPISwDispatchClose( 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;
}
NTSTATUSNTAPISwAddDevice( IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject){ NTSTATUS Status; PDEVICE_OBJECT FunctionalDeviceObject;
DPRINT("SWENUM AddDevice\n"); /* 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;}
VOIDNTAPISwUnload( IN PDRIVER_OBJECT DriverObject){ /* nop */}
NTSTATUSNTAPIDriverEntry( 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;
DPRINT("SWENUM loaded\n"); return STATUS_SUCCESS;}