C/C++底层实现指定磁盘只读

本文介绍了一个使用C/C++编写的驱动程序,通过挂钩技术强制磁盘处于只读状态,以确保涉密计算机系统的稳定性。驱动主要包含设备扩展结构、设备对象的创建、附加到底层驱动以及各种调度函数的实现,如DispatchForSCSI、DispatchPower等,以实现对磁盘读写操作的控制。
摘要由CSDN通过智能技术生成

燕狂徒写的驱动挂钩,限制磁盘只读,

用于保证涉密计算机的稳定,相当于将磁盘变成ROM

 

#include "ntddk.h"
#include <srb.h>
#include <scsi.h>

#define DRIVERNAME "OnlyRead(GongXiPeng!)"     // for use in messages

typedef struct tagDEVICE_EXTENSION {
 PDEVICE_OBJECT DeviceObject;   // device object this extension belongs to
 PDEVICE_OBJECT LowerDeviceObject;  // next lower driver in same stack
 PDEVICE_OBJECT Pdo;      // the PDO
 IO_REMOVE_LOCK RemoveLock;
 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;

VOID RemoveDevice(IN PDEVICE_OBJECT fdo);
NTSTATUS CompleteRequest(IN PIRP Irp, IN NTSTATUS status, IN ULONG_PTR info);
NTSTATUS DispatchForSCSI(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo);

NTSTATUS DispatchAny(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchPower(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchPnp(IN PDEVICE_OBJECT fido, IN PIRP Irp);
NTSTATUS DispatchWmi(IN PDEVICE_OBJECT fido, IN PIRP Irp);
ULONG GetDeviceTypeToUse(PDEVICE_OBJECT pdo);
NTSTATUS StartDeviceCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);
NTSTATUS UsageNotificationCompletionRoutine(PDEVICE_OBJECT fido, PIRP Irp, PDEVICE_EXTENSION pdx);

VOID DriverUnload(IN PDRIVER_OBJECT fido);

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
 int i;
 
 KdPrint(("准备驱动加载"));
 UNREFERENCED_PARAMETER(RegistryPath);
 DriverObject->DriverUnload = DriverUnload;
 DriverObject->DriverExtension->AddDevice = AddDevice;
 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; ++i)
  DriverObject->MajorFunction[i] = DispatchAny;
 DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower;
    DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp;
 DriverObject->MajorFunction[IRP_MJ_SCSI] = DispatchForSCSI;

 return(STATUS_SUCCESS);
}

VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
{       // DriverUnload
 PAGED_CODE();
 //UNREFERENCED_PARAMETER(DriverObject);
 KdPrint((DRIVERNAME " - Entering DriverUnload: DriverObject %8.8lX/n", DriverObject));
}

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{       // AddDevice
 
 NTSTATUS status;
 PDEVICE_OBJECT fido;
 PDEVICE_EXTENSION pdx;
 PDEVICE_OBJECT fdo;

 PAGED_CODE();

 status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL,
  GetDeviceTypeToUse(pdo), 0, FALSE, &fido);
 if (!NT_SUCCESS(status))
 {      // can't create device object
  KdPrint((DRIVERNAME " - IoCreateDevice failed - %X/n", status));
  return status;
 }      // can't create device object
 
 pdx = (PDEVICE_EXTENSION) fido->DeviceExtension;
 do
 {      // finish initialization
  IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0);
  pdx->DeviceObject = fido;
  pdx->Pdo = pdo;
  //

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尹成

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值