mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 21:05:43 +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;
|
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
|
KSDDKAPI
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -1596,13 +1668,13 @@ KsDeviceSetBusData(
|
||||||
IN ULONG Offset,
|
IN ULONG Offset,
|
||||||
IN ULONG Length)
|
IN ULONG Length)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
return KspDeviceSetGetBusData(Device->PhysicalDeviceObject, /* is this right? */
|
||||||
return 0;
|
DataType, Buffer, Offset, Length, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@unimplemented
|
@implemented
|
||||||
*/
|
*/
|
||||||
KSDDKAPI
|
KSDDKAPI
|
||||||
ULONG
|
ULONG
|
||||||
|
@ -1614,8 +1686,9 @@ KsDeviceGetBusData(
|
||||||
IN ULONG Offset,
|
IN ULONG Offset,
|
||||||
IN ULONG Length)
|
IN ULONG Length)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
return KspDeviceSetGetBusData(Device->PhysicalDeviceObject, /* is this right? */
|
||||||
return 0;
|
DataType, Buffer, Offset, Length, TRUE);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1788,6 +1861,28 @@ KsServiceBusEnumPnpRequest(
|
||||||
return STATUS_UNSUCCESSFUL;
|
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
|
@unimplemented
|
||||||
*/
|
*/
|
||||||
|
@ -1797,10 +1892,42 @@ NTAPI
|
||||||
KsRemoveBusEnumInterface(
|
KsRemoveBusEnumInterface(
|
||||||
IN PIRP Irp)
|
IN PIRP Irp)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
KPROCESSOR_MODE Mode;
|
||||||
return STATUS_UNSUCCESSFUL;
|
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;
|
return (ULONG)-1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
@unimplemented
|
|
||||||
*/
|
|
||||||
KSDDKAPI
|
|
||||||
PKSPIN
|
|
||||||
NTAPI
|
|
||||||
KsGetPinFromIrp(
|
|
||||||
IN PIRP Irp)
|
|
||||||
{
|
|
||||||
UNIMPLEMENTED
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
|
@ -113,5 +113,10 @@ typedef struct
|
||||||
PIO_WORKITEM WorkItem;
|
PIO_WORKITEM WorkItem;
|
||||||
}PNP_POSTSTART_CONTEXT, *PPNP_POSTSTART_CONTEXT;
|
}PNP_POSTSTART_CONTEXT, *PPNP_POSTSTART_CONTEXT;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
PIRP Irp;
|
||||||
|
KEVENT Event;
|
||||||
|
}KSREMOVE_BUS_INTERFACE_CTX, *PKSREMOVE_BUS_INTERFACE_CTX;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -510,6 +510,27 @@ KsPinReleaseProcessingMutex(
|
||||||
KeReleaseMutex(&This->ProcessingMutex, FALSE);
|
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
|
@unimplemented
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue