現在、各ドライブ(C:, D:, ...)のフィルタドライバを作成しています。
そこで、事始めに IoAttachDeviceToDeviceStack で Attach だけして
全 IPR をそのまま下位デバイスへ渡すドライバを作ってみました。

ディスパッチルーチンは、Toaster の filter.c を参考にして、
以下のように記述して、全 IRP_MAJOR_FUNCTION に適用しています。

NTSTATUS dispatch_pass(IN PDEVICE_OBJECT device, IN PIRP irp) {
PDEVICE_EXTENSION ext = NULL;
NTSTATUS status = STATUS_SUCCESS;

PAGED_CODE();

ext = reinterpret_cast<PDEVICE_EXTENSION>(device->DeviceExtension);
status = IoAcquireRemoveLock(&ext->lock, irp);
if (status != STATUS_SUCCESS) { ... }

IoSkipCurrentIrpStackLocation(irp);
status = IoCallDriver(ext->target, irp);
IoReleaseRemoveLock(&ext->lock, irp);
return status;
}

これでテストしたところ IRP_MJ_READ や IRP_MJ_WRITE を受信したときに、
頻繁にブルースクリーンが発生します。ファイルサイズが小さな場合は成功するときもあるのですが・・・

スレッド間での排他処理を記述しなければならないのかなとも思いましたが、単にリクエストを下位デバイスに渡すだけでも
そういった処理は記述する必要なのでしょうか?