mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 06:25:49 +00:00
- Implement KsDeviceSetBusData, KsDeviceGetBusData, KsGetPinFromIrp
svn path=/trunk/; revision=42295
This commit is contained in:
parent
2b1eb860d8
commit
3aba36805e
4 changed files with 162 additions and 21 deletions
|
@ -1583,8 +1583,80 @@ KsCreateBusEnumObject(
|
|||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
KspSetGetBusDataCompletion(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN PIRP Irp,
|
||||
IN PVOID Context)
|
||||
{
|
||||
/* signal completion */
|
||||
KeSetEvent((PRKEVENT)Context, IO_NO_INCREMENT, FALSE);
|
||||
|
||||
/* more work needs be done, so dont free the irp */
|
||||
return STATUS_MORE_PROCESSING_REQUIRED;
|
||||
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
KspDeviceSetGetBusData(
|
||||
IN PDEVICE_OBJECT DeviceObject,
|
||||
IN ULONG DataType,
|
||||
IN PVOID Buffer,
|
||||
IN ULONG Offset,
|
||||
IN ULONG Length,
|
||||
IN BOOL bGet)
|
||||
{
|
||||
PIO_STACK_LOCATION IoStack;
|
||||
PIRP Irp;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
|
||||
/* allocate the irp */
|
||||
Irp = IoAllocateIrp(1, /*FIXME */
|
||||
FALSE);
|
||||
|
||||
if (!Irp)
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
|
||||
/* initialize the event */
|
||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
||||
|
||||
/* get next stack location */
|
||||
IoStack = IoGetNextIrpStackLocation(Irp);
|
||||
|
||||
/* setup a completion routine */
|
||||
IoSetCompletionRoutine(Irp, KspSetGetBusDataCompletion, (PVOID)&Event, TRUE, TRUE, TRUE);
|
||||
|
||||
/* setup parameters */
|
||||
IoStack->Parameters.ReadWriteConfig.Buffer = Buffer;
|
||||
IoStack->Parameters.ReadWriteConfig.Length = Length;
|
||||
IoStack->Parameters.ReadWriteConfig.Offset = Offset;
|
||||
IoStack->Parameters.ReadWriteConfig.WhichSpace = DataType;
|
||||
/* setup function code */
|
||||
IoStack->MajorFunction = IRP_MJ_PNP;
|
||||
IoStack->MinorFunction = (bGet ? IRP_MN_READ_CONFIG : IRP_MN_WRITE_CONFIG);
|
||||
|
||||
/* lets call the driver */
|
||||
Status = IoCallDriver(DeviceObject, Irp);
|
||||
|
||||
/* is the request still pending */
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
/* have a nap */
|
||||
KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
|
||||
/* update status */
|
||||
Status = Irp->IoStatus.Status;
|
||||
}
|
||||
|
||||
/* free the irp */
|
||||
IoFreeIrp(Irp);
|
||||
/* done */
|
||||
return Status;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
ULONG
|
||||
|
@ -1596,13 +1668,13 @@ KsDeviceSetBusData(
|
|||
IN ULONG Offset,
|
||||
IN ULONG Length)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
return 0;
|
||||
return KspDeviceSetGetBusData(Device->PhysicalDeviceObject, /* is this right? */
|
||||
DataType, Buffer, Offset, Length, FALSE);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
ULONG
|
||||
|
@ -1614,8 +1686,9 @@ KsDeviceGetBusData(
|
|||
IN ULONG Offset,
|
||||
IN ULONG Length)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
return 0;
|
||||
return KspDeviceSetGetBusData(Device->PhysicalDeviceObject, /* is this right? */
|
||||
DataType, Buffer, Offset, Length, TRUE);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1788,6 +1861,28 @@ KsServiceBusEnumPnpRequest(
|
|||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
VOID
|
||||
NTAPI
|
||||
KspRemoveBusInterface(
|
||||
PVOID Ctx)
|
||||
{
|
||||
PKSREMOVE_BUS_INTERFACE_CTX Context =(PKSREMOVE_BUS_INTERFACE_CTX)Ctx;
|
||||
|
||||
/* TODO
|
||||
* get SWENUM_INSTALL_INTERFACE struct
|
||||
* open device key and delete the keys
|
||||
*/
|
||||
|
||||
UNIMPLEMENTED
|
||||
|
||||
/* set status */
|
||||
Context->Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
|
||||
|
||||
|
||||
/* signal completion */
|
||||
KeSetEvent(&Context->Event, IO_NO_INCREMENT, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
*/
|
||||
|
@ -1797,10 +1892,42 @@ NTAPI
|
|||
KsRemoveBusEnumInterface(
|
||||
IN PIRP Irp)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
KPROCESSOR_MODE Mode;
|
||||
LUID luid;
|
||||
KSREMOVE_BUS_INTERFACE_CTX Ctx;
|
||||
WORK_QUEUE_ITEM WorkItem;
|
||||
|
||||
/* get previous mode */
|
||||
Mode = ExGetPreviousMode();
|
||||
|
||||
/* convert to luid */
|
||||
luid = RtlConvertUlongToLuid(SE_LOAD_DRIVER_PRIVILEGE);
|
||||
|
||||
/* perform access check */
|
||||
if (!SeSinglePrivilegeCheck(luid, Mode))
|
||||
{
|
||||
/* insufficient privileges */
|
||||
return STATUS_PRIVILEGE_NOT_HELD;
|
||||
}
|
||||
/* initialize event */
|
||||
KeInitializeEvent(&Ctx.Event, NotificationEvent, FALSE);
|
||||
|
||||
/* store irp in ctx */
|
||||
Ctx.Irp = Irp;
|
||||
|
||||
/* initialize work item */
|
||||
ExInitializeWorkItem(&WorkItem, KspRemoveBusInterface, (PVOID)&Ctx);
|
||||
|
||||
/* now queue the work item */
|
||||
ExQueueWorkItem(&WorkItem, DelayedWorkQueue);
|
||||
|
||||
/* wait for completion */
|
||||
KeWaitForSingleObject(&Ctx.Event, Executive, KernelMode, FALSE, NULL);
|
||||
|
||||
/* return result */
|
||||
return Ctx.Irp->IoStatus.Status;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -1622,15 +1622,3 @@ KsGetNodeIdFromIrp(
|
|||
return (ULONG)-1;
|
||||
}
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
PKSPIN
|
||||
NTAPI
|
||||
KsGetPinFromIrp(
|
||||
IN PIRP Irp)
|
||||
{
|
||||
UNIMPLEMENTED
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -113,5 +113,10 @@ typedef struct
|
|||
PIO_WORKITEM WorkItem;
|
||||
}PNP_POSTSTART_CONTEXT, *PPNP_POSTSTART_CONTEXT;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
PIRP Irp;
|
||||
KEVENT Event;
|
||||
}KSREMOVE_BUS_INTERFACE_CTX, *PKSREMOVE_BUS_INTERFACE_CTX;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -510,6 +510,27 @@ KsPinReleaseProcessingMutex(
|
|||
KeReleaseMutex(&This->ProcessingMutex, FALSE);
|
||||
}
|
||||
|
||||
/*
|
||||
@implemented
|
||||
*/
|
||||
KSDDKAPI
|
||||
PKSPIN
|
||||
NTAPI
|
||||
KsGetPinFromIrp(
|
||||
IN PIRP Irp)
|
||||
{
|
||||
PKSIOBJECT_HEADER ObjectHeader;
|
||||
PIO_STACK_LOCATION IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||
|
||||
/* get object header */
|
||||
ObjectHeader = (PKSIOBJECT_HEADER)IoStack->FileObject->FsContext;
|
||||
/* return object type */
|
||||
return (PKSPIN)ObjectHeader->ObjectType;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
@unimplemented
|
||||
*/
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue