使用NT_SUCCESS()宏判断驱动返回NTSTATUS值的原因

85 篇文章 6 订阅
83 篇文章 9 订阅

根据大佬的博客,首先

//
//  Status values are 32 bit values laid out as follows:
//
//   3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
//   1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
//  +---+-+-------------------------+-------------------------------+
//  |Sev|C|       Facility          |               Code            |
//  +---+-+-------------------------+-------------------------------+
//
//  where
//
//      Sev - is the severity code
//
//          00 - Success
//          01 - Informational
//          10 - Warning
//          11 - Error
//
//      C - is the Customer code flag
//
//      Facility - is the facility code
//
//      Code - is the facility's status code
//

//
// Generic test for success on any status value (non-negative numbers
// indicate success).
//

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

//
// Generic test for information on any status value.
//

所以可见NTSTATUS是个有符号的长整数,在Sev域中,是安全码,正的代表成功,负的代表失败,所以00和01表示成功的状态,10和11表示错误状态。即对于这样的有符号长整数的最高位(也就是符号位) ,0成功,1错误。,如果NTSTATUS>=0为成功,NTSTATUS<0为错误。所以定义

#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)

大于1时候成功

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
获取底层硬盘驱动对象并向其发送IRP_MJ_WRITE请求,可以通过以下步骤实现: 1. 获取磁盘设备对象 可以使用 WdfDeviceGetIoTarget 函数获取磁盘设备的 WDFIOTARGET 对象,如下所示: ``` WDFIOTARGET target; target = WdfDeviceGetIoTarget(Device); ``` 2. 构建写请求 可以使用 WdfIoTargetSendWriteSynchronously 函数向磁盘设备发送 IRP_MJ_WRITE 请求,如下所示: ``` WDF_REQUEST_REUSE_PARAMS reuseParams; WDF_REQUEST_REUSE_PARAMS_INIT(&reuseParams, WDF_REQUEST_REUSE_NO_FLAGS, STATUS_SUCCESS); WdfRequestReuse(Request, &reuseParams); LARGE_INTEGER byteOffset; byteOffset.QuadPart = offset; NTSTATUS status = WdfIoTargetSendWriteSynchronously(target, NULL, Request, &byteOffset, &length, NULL, NULL); ``` 其中,Request 是 WDFREQUEST 对象,offset 是要写入的起始字节偏移量,length 是要写入的字节数。 完整示例代码如下: ``` NTSTATUS WriteDisk( _In_ WDFDEVICE Device, _In_ LONGLONG offset, _In_ ULONG length, _In_ PVOID buffer) { NTSTATUS status = STATUS_SUCCESS; WDF_REQUEST_REUSE_PARAMS reuseParams; WDF_REQUEST_REUSE_PARAMS_INIT(&reuseParams, WDF_REQUEST_REUSE_NO_FLAGS, STATUS_SUCCESS); WDFIOTARGET target; target = WdfDeviceGetIoTarget(Device); WDFREQUEST Request; WDF_OBJECT_ATTRIBUTES attributes; WDF_OBJECT_ATTRIBUTES_INIT(&attributes); attributes.ParentObject = Device; status = WdfRequestCreate(&attributes, target, &Request); if (!NT_SUCCESS(status)) { return status; } LARGE_INTEGER byteOffset; byteOffset.QuadPart = offset; WdfRequestSetCompletionRoutine(Request, WriteDiskCompletionRoutine, buffer); status = WdfIoTargetFormatRequestForWrite(target, Request, NULL, NULL, &byteOffset, NULL); if (!NT_SUCCESS(status)) { WdfObjectDelete(Request); return status; } PVOID dataBuffer; status = WdfRequestRetrieveOutputBuffer(Request, length, &dataBuffer, NULL); if (!NT_SUCCESS(status)) { WdfObjectDelete(Request); return status; } RtlCopyMemory(dataBuffer, buffer, length); status = WdfIoTargetSendRequestSynchronously(target, Request, NULL); if (!NT_SUCCESS(status)) { WdfObjectDelete(Request); return status; } status = WdfRequestUnmarkCancelable(Request); if (!NT_SUCCESS(status)) { WdfObjectDelete(Request); return status; } status = WdfRequestReuse(Request, &reuseParams); if (!NT_SUCCESS(status)) { WdfObjectDelete(Request); return status; } return STATUS_SUCCESS; } VOID WriteDiskCompletionRoutine( _In_ WDFREQUEST Request, _In_ WDFIOTARGET Target, _In_ PWDF_REQUEST_COMPLETION_PARAMS Params, _In_ WDFCONTEXT Context) { WdfObjectDelete(Request); } ``` 注意,以上代码仅为示例,具体实现可能需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值