关于IoGetDeviceObjectPointer返回的NTSTATUS判定

shijizhishang_1 2012-10-19 04:57:10
使用DbgPrint("%d",status);获得的返回值是-1073741772,我不太清楚这是个什么错误,如果我要把它变成16进制,那他是什么码?原码,补码,反码,我应该怎么转换,或者有没有不用转换的方法就可以直接获得类似于STATUS_SUCCESS这样的返回值??
...全文
196 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
shijizhishang_1 2012-10-25
  • 打赏
  • 举报
回复
谢谢大家
大熊猫侯佩 2012-10-22
  • 打赏
  • 举报
回复
打印16位数字和printf类似:DbgPrint("%08x",status)

至于status值的含义,可以到ddk头文件里或者网上搜索。
shijizhishang_1 2012-10-22
  • 打赏
  • 举报
回复
我用的是寒江独钓的实例,

/*
**************************************************************************************
*==文件名称:SerialPort.cpp
*==文件描述:关于过滤串口的源文件
*==作 者:jimmy
*==编写时间:2012-10-19
**************************************************************************************
*/


#include<ntddk.h>
//*===================================================================================
//*预处理定义
//*===================================================================================
extern "C" NTSTATUS Dispatch(PDEVICE_OBJECT devobj,PIRP irp);
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
extern "C" VOID DriverUnload(PDRIVER_OBJECT DriverObject);
#pragma alloc_text(INIT,DriverEntry)
#pragma alloc_text(PAGE,DriverUnload)
#pragma alloc_text(PAGE,Dispatch)
#define DELAY_ONE_MICROSECOND (-10)
#define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
#define DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)
PDEVICE_OBJECT attobj=NULL;//用于存放绑定的设备
PDEVICE_OBJECT fltobj=NULL;//用于存放生成的过滤设备
//*===================================================================================
//*=函数名称:DriverUnload
//*=函数功能:驱动程序的卸载函数
//*=入口参数:PDRIVER_OBJECT
//*=出口参数:NTSTATUS;
//*====================================================================================
VOID DriverUnload(PDRIVER_OBJECT DriverObject)
{
ULONG i=0;
LARGE_INTEGER interval;
//解除锁定
if(NULL!=attobj)
{
IoDetachDevice(attobj);
}
//睡眠5秒,等待所有IRP处理结束
interval.QuadPart =(5*1000*DELAY_ONE_MILLISECOND);
KeDelayExecutionThread(KernelMode,FALSE,&interval);
//删除设备
if(NULL!=fltobj)
{
IoDeleteDevice(fltobj);

}
return ;

}
//*====================================================================================
//*函数名称:AttatchAllPorts
//*函数功能:该函数用于打开串口并生成过滤设备
//*入口参数:PDRIVER_OBJECT
//*出口参数:VOID
//*====================================================================================
VOID AttatchAllPorts(PDRIVER_OBJECT DriverObject)
{
//打开一个串口设备
UNICODE_STRING port_name;
NTSTATUS status={0};
RtlInitUnicodeString(&port_name,L"\\Device\\Serial0");
PFILE_OBJECT fileobj=NULL;
PDEVICE_OBJECT devobj=NULL;//用于存放打开的设备
PDEVICE_OBJECT fltobj=NULL;//用于存放生成的过滤设备
//打开设备对象
status=IoGetDeviceObjectPointer(&port_name,FILE_ALL_ACCESS,&fileobj,&devobj);
//检测是否打开成功
if(NT_SUCCESS(status))
{
//打开成功,解除文件对象的引用
ObDereferenceObject(fileobj);
}
else
{
_asm
{
int 3;//在此停止,即没有成功打开串口

}
DbgPrint("执行不成功");
DbgPrint("设备名称:%ws",port_name.Buffer);
return;
}
//生成设备对象用于绑定
status=IoCreateDevice(DriverObject,0,&port_name,devobj->DeviceType ,0,FALSE,&fltobj);
if(STATUS_SUCCESS==status)
{
//拷贝重要标志位
if(devobj->Flags&DO_BUFFERED_IO)
{
fltobj->Flags|=DO_BUFFERED_IO;
}
if(devobj->Flags&DO_DIRECT_IO)
{
fltobj->Flags |=DO_DIRECT_IO;
}
if(devobj->Characteristics &FILE_DEVICE_SECURE_OPEN)
{
fltobj->Characteristics |=FILE_DEVICE_SECURE_OPEN;
}
fltobj->Flags |=DO_POWER_PAGABLE;
}
else
{
_asm
{
int 3;
}
return ;
}
//将一个设备绑定到另一个设备上
status=IoAttachDevice(fltobj,&port_name,&attobj);
if(STATUS_SUCCESS!=status)
{
IoDeleteDevice(fltobj);
_asm
{
int 3;
}
return ;
}
else//成功绑定
{
//设定这个设备已经启动
fltobj->Flags =fltobj->Flags &~DO_DEVICE_INITIALIZING;
}
return;
}
//*====================================================================================
//*函数名称:Dispatch
//*函数功能:驱动程序的分发函数
//*入口参数:PDEVICE_OBJECT,PIRP
//*出口参数:NTSTATUS
//*====================================================================================
NTSTATUS Dispatch(PDEVICE_OBJECT devobj,PIRP irp)
{
PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(irp);
NTSTATUS status={0};
ULONG j=0;
//根据来的 IRP请求来决定做什么样的操作
if(IRP_MJ_POWER==irpsp->MajorFunction )
{
//直接发送电源请求,返回已经处理
PoStartNextPowerIrp(irp);
IoSkipCurrentIrpStackLocation(irp);
return PoCallDriver(attobj,irp);
}
if(IRP_MJ_WRITE==irpsp->MajorFunction )
{
//如果是写先获得写的长度
ULONG len=irpsp->Parameters .Write .Length ;
//然后获得缓冲区
PUCHAR buf=NULL;
if(NULL!=irp->MdlAddress )
{
buf=(PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress ,NormalPagePriority);
}
else
{
buf=(PUCHAR)irp->UserBuffer ;
}
if(NULL==buf)
{
buf=(PUCHAR)irp->AssociatedIrp .SystemBuffer ;
}
//打印内容
for(j=0;j<len;j++)
{
DbgPrint("comcap:Send Data:%2x\r\n",buf[j]);
}
//将这些请求直接下发执行
IoSkipCurrentIrpStackLocation(irp);
return IoCallDriver(attobj,irp);

}
irp->IoStatus .Information =0;
irp->IoStatus .Status =STATUS_INVALID_PARAMETER;
IoCompleteRequest(irp,IO_NO_INCREMENT);
return STATUS_SUCCESS;

}

//*====================================================================================
//*函数名称:DriverEntry
//*函数功能:驱动程序的入口函数
//*入口参数: PDRIVER_OBJJECT,PUNICODE_STRING
//*出口参数:NTSTATUS
//*====================================================================================

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
size_t i=0;
//定义分发函数
for(i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
{
DriverObject->MajorFunction [i]=Dispatch;
}
//支持动态卸载
DriverObject->DriverUnload =DriverUnload;
//绑定所有串口
AttatchAllPorts(DriverObject);
return STATUS_SUCCESS;


}
/*
*********************************************************************************************
*==文件结尾
*********************************************************************************************
*/

怎么做?还有怎么查看本机上的串行端口号
曹大夯 2012-10-22
  • 打赏
  • 举报
回复
笨办法,直接去文件里面搜的。

将10进制的错误代码换成十六进制的,然后去头文件里面寻找就好了。
曹大夯 2012-10-22
  • 打赏
  • 举报
回复
用工具WinObj v2.22 查看你系统里面串口对应的DosDevice名称(在Device目录下)。
然后用正确的名称去初始化port_name。
shijizhishang_1 2012-10-19
  • 打赏
  • 举报
回复
楼上,能告诉我是怎么找到的吗?
曹大夯 2012-10-19
  • 打赏
  • 举报
回复
ntstatus.h

//
// MessageId: STATUS_OBJECT_NAME_NOT_FOUND
//
// MessageText:
//
// Object Name not found.
//
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧