system crashed when i Split an irp into two partial irp

Hi All,
I want to split a read irp into two partial irp in my disk filter driver. it’s allways
cause system crash. The bug-code was irql_not_less_or_equal and the irql was 0x0D at that time. The following is my code.

NTSTATUS
FrzReadIrp(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{

lpRefractIrp = FrzAllocateRefractedIrp(DeviceObject,Irp,3);
if(lpRefractIrp==NULL)
{
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return STATUS_INSUFFICIENT_RESOURCES;
}
if(luSecCountToRead == 0)
{
lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = \
CrtIoStack->Parameters.Read.ByteOffset.QuadPart;
lpRefractIrp->CrtBlk->Length = CrtIoStack->Parameters.Read.Length - 0x200;
lpRefractIrp->CrtBlk->BufferOffset = 0;
lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
lpRefractIrp->CrtBlk++;
lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = \
CrtIoStack->Parameters.Read.ByteOffset.QuadPart \

  • CrtIoStack->Parameters.Read.Length - 0x200;
    lpRefractIrp->CrtBlk->Length = 0x200;
    lpRefractIrp->CrtBlk->BufferOffset = CrtIoStack->Parameters.Read.Length - 0x200;
    lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
    }
    else
    {
    lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = \
    CrtIoStack->Parameters.Read.ByteOffset.QuadPart;
    lpRefractIrp->CrtBlk->Length = CrtIoStack->Parameters.Read.Length;
    lpRefractIrp->CrtBlk->BufferOffset = 0;
    lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
    }

lpRefractIrp->CrtBlk++;
lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_INVALID;

lpRefractIrp->CrtBlk = &lpRefractIrp->StallBlksArr[0];

CrtIrql = KeGetCurrentIrql(); // ???
Status = FrzProcessRefractedBlocks(DeviceExtension->TargetDeviceObject,lpRefractIrp);
CrtIrql = KeGetCurrentIrql(); // ???
}
// if(Status != STATUS_PENDING)
{
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
}
return Status;

Do not forget to split the data buffer by IoBuildPartialMdl.

Maxim Shatskih, Windows DDK MVP
StorageCraft Corporation
xxxxx@storagecraft.com
http://www.storagecraft.com

----- Original Message -----
From: “Archims”
To: “Windows File Systems Devs Interest List”
Sent: Sunday, May 02, 2004 8:53 AM
Subject: [ntfsd] system crashed when i Split an irp into two partial irp

> Hi All,
> I want to split a read irp into two partial irp in my disk filter driver.
it’s allways
> cause system crash. The bug-code was irql_not_less_or_equal and the irql was
0x0D at that time. The following is my code.
>
> NTSTATUS
> FrzReadIrp(
> IN PDEVICE_OBJECT DeviceObject,
> IN PIRP Irp
> )
> {
> …
>
> lpRefractIrp = FrzAllocateRefractedIrp(DeviceObject,Irp,3);
> if(lpRefractIrp==NULL)
> {
> IoCompleteRequest(Irp,IO_NO_INCREMENT);
> return STATUS_INSUFFICIENT_RESOURCES;
> }
> if(luSecCountToRead == 0)
> {
> lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = <br>> CrtIoStack->Parameters.Read.ByteOffset.QuadPart;
> lpRefractIrp->CrtBlk->Length = CrtIoStack->Parameters.Read.Length - 0x200;
> lpRefractIrp->CrtBlk->BufferOffset = 0;
> lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
> lpRefractIrp->CrtBlk++;
> lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = <br>> CrtIoStack->Parameters.Read.ByteOffset.QuadPart <br>> + CrtIoStack->Parameters.Read.Length - 0x200;
> lpRefractIrp->CrtBlk->Length = 0x200;
> lpRefractIrp->CrtBlk->BufferOffset = CrtIoStack->Parameters.Read.Length -
0x200;
> lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
> }
> else
> {
> lpRefractIrp->CrtBlk->RefractedOffset.QuadPart = <br>> CrtIoStack->Parameters.Read.ByteOffset.QuadPart;
> lpRefractIrp->CrtBlk->Length = CrtIoStack->Parameters.Read.Length;
> lpRefractIrp->CrtBlk->BufferOffset = 0;
> lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_VALID;
> }
>
> lpRefractIrp->CrtBlk++;
> lpRefractIrp->CrtBlk->Sign = REFBLK_SIGN_INVALID;
>
> lpRefractIrp->CrtBlk = &lpRefractIrp->StallBlksArr[0];
>
>
> CrtIrql = KeGetCurrentIrql(); // ???
> Status =
FrzProcessRefractedBlocks(DeviceExtension->TargetDeviceObject,lpRefractIrp);
> CrtIrql = KeGetCurrentIrql(); // ???
> }
> // if(Status != STATUS_PENDING)
> {
> Irp->IoStatus.Status = Status;
> IoCompleteRequest(Irp,IO_NO_INCREMENT);
> }
> return Status;
>
>
>
> —
> Questions? First check the IFS FAQ at
https://www.osronline.com/article.cfm?id=17
>
> You are currently subscribed to ntfsd as: xxxxx@storagecraft.com
> To unsubscribe send a blank email to xxxxx@lists.osr.com