21,599
社区成员
发帖
与我相关
我的任务
分享
#pragma LOCKED
void StartIO(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
KdPrint(("Call StartIO\n"));
KSPIN_LOCK a;
KIRQL irql;
KeAcquireSpinLock(&a, &irql);
if(pIrp != pDevObj->CurrentIrp || pIrp->Cancel)
{
KeReleaseSpinLock(&a, irql);
return;
}
else
{
IoSetCancelRoutine(pIrp, NULL);
KeReleaseSpinLock(&a, irql);
}
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
int offset;
int length;
unsigned char key = stack->MajorFunction;
pDevice_ext pdx = (pDevice_ext)pDevObj->DeviceExtension;
if(key == IRP_MJ_READ)
{
offset = stack->Parameters.Read.ByteOffset.QuadPart;
length = stack->Parameters.Read.Length;
KdPrint(("Read %d %d\n", offset, length));
if(offset + length <= pdx->datalen)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = length;
memcpy(pIrp->AssociatedIrp.SystemBuffer, pdx->data + offset, length);
}
else
{
pIrp->IoStatus.Status = STATUS_END_OF_FILE;
pIrp->IoStatus.Information = 0;
}
}
else if(key == IRP_MJ_WRITE)
{
offset = stack->Parameters.Write.ByteOffset.QuadPart;
length = stack->Parameters.Write.Length;
KdPrint(("Write %d %d\n", offset, length));
if(offset + length <= pdx->datalen)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = length;
memcpy(pdx->data + offset, pIrp->AssociatedIrp.SystemBuffer, length);
}
else
{
pIrp->IoStatus.Status = STATUS_END_OF_FILE;
pIrp->IoStatus.Information = 0;
}
}
else
{
pIrp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
pIrp->IoStatus.Information = 0;
}
KdPrint(("status = %d\n", pIrp->IoStatus.Status));
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
IoStartNextPacket(pDevObj, true);
}