首页
社区
课程
招聘
[求助]扩展设备保存注册表的路径有时可以显示正常有时不正常!
发表于: 2009-12-1 16:14 4115

[求助]扩展设备保存注册表的路径有时可以显示正常有时不正常!

2009-12-1 16:14
4115
看过一下正常的,其它的好像基本没显示?
.h文件
#include <ntddk.h>
typedef struct _MY_EXTENDEVICE{ //extend device
	PDEVICE_OBJECT PDevice;//point to device
	UNICODE_STRING DeviceName;//device name
	UNICODE_STRING DeviceSymbolic;//device symbolic  
	UNICODE_STRING PServiceRegPath;//reg path
//	size_t DeviceNumber;//device number
}MY_EXTENDEVICE,*PMY_EXTENDEVICE;//var

VOID MyUnload(PDRIVER_OBJECT mydriver);
NTSTATUS MyDispatch(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
NTSTATUS IoCreate(IN PDRIVER_OBJECT mydriver,IN PUNICODE_STRING myregpath);


.c文件
#include "head.h"

NTSTATUS DriverEntry(IN PDRIVER_OBJECT mydriver,IN PUNICODE_STRING myregpath)
{
	NTSTATUS stauts;
	mydriver->DriverUnload=MyUnload;
	mydriver->MajorFunction[IRP_MJ_CREATE]=MyDispatch;
    mydriver->MajorFunction[IRP_MJ_CLOSE]=MyDispatch;
    stauts= IoCreate(mydriver,myregpath);
	if (!NT_SUCCESS(stauts))
	{
    KdPrint(("Error\n"));       
	}
    KdPrint(("Start\n"));
	return STATUS_SUCCESS;
}


VOID MyUnload(PDRIVER_OBJECT mydriver)
{
	PDEVICE_OBJECT punobj;
	UNICODE_STRING deviname;
	UNICODE_STRING desmbolic;
    PMY_EXTENDEVICE	pdeobj;
	punobj=mydriver->DeviceObject;//
	if (punobj!=NULL)
	{
		pdeobj=(PMY_EXTENDEVICE)punobj->DeviceExtension;
		KdPrint(("%wZ",&pdeobj->DeviceName)) ;
		KdPrint(("%wZ",&pdeobj->PServiceRegPath)) ;
		KdPrint(("%wZ",&pdeobj->DeviceSymbolic)) ;
		deviname=pdeobj->DeviceName;
		desmbolic=pdeobj->DeviceSymbolic;
		IoDeleteSymbolicLink(&desmbolic);
		IoDeleteDevice(punobj);
	}
    KdPrint(("End\n"));
}
NTSTATUS MyDispatch(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
    PMY_EXTENDEVICE	pdeobj;
	pdeobj=(PMY_EXTENDEVICE)pDevObj->DeviceExtension;
	KdPrint(("Dispatch Start")) ;
	KdPrint(("%wZ",&pdeobj->DeviceName)) ;
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest( pIrp, IO_NO_INCREMENT );
	KdPrint(("Dispatch End")) ;
	return STATUS_SUCCESS;
}

NTSTATUS IoCreate(IN PDRIVER_OBJECT  mydriver,IN PUNICODE_STRING myregpath)
{
	NTSTATUS status;
	UNICODE_STRING dname;
    UNICODE_STRING dsymbolic;
	UNICODE_STRING dregpath;
    PDEVICE_OBJECT deviceobj;
	PMY_EXTENDEVICE pdeextobj;
	RtlInitUnicodeString(&dname,L"\\Device\\MyDevice");
	RtlInitUnicodeString(&dsymbolic,L"\\??\\MyDevice");
	status=IoCreateDevice(mydriver,sizeof(MY_EXTENDEVICE),&dname,FILE_DEVICE_UNKNOWN,0,TRUE,&deviceobj);
	if (!NT_SUCCESS(status))
	{
		KdPrint(("CreateDevice Error\n"));
		return status;
	}
	pdeextobj=(PMY_EXTENDEVICE)deviceobj->DeviceExtension;
	memset(pdeextobj,0,sizeof(MY_EXTENDEVICE));
//	deviceobj->Flags |=DO_BUFFERED_IO;
	pdeextobj->PDevice=deviceobj;
	pdeextobj->DeviceName=dname;
	pdeextobj->DeviceSymbolic=dsymbolic;
	pdeextobj->PServiceRegPath=*myregpath;
	status=IoCreateSymbolicLink(&dsymbolic,&dname);
	if (!NT_SUCCESS(status))
	{
		KdPrint(("CreateSymbolic Error\n"));
		IoDeleteDevice(deviceobj);
		return status;
	}
	return STATUS_SUCCESS;
}


调用:

.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
;include gdi32.inc  ;图形
includelib user32.lib
includelib kernel32.lib
;includelib gde32.lib
include macro.asm  ;ctxt("")
.data
szAddr db '\\.\MyDevice',0 
szFmat db '%d',0
.data?
hInstance dd ?  
hFile dd ? 
szBuffer db 50 dup (?)
.code
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke CreateFile,addr szAddr,GENERIC_READ or GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.if eax==INVALID_HANDLE_VALUE
  ;invoke MessageBox,NULL,CTXT("打开出错"),CTXT("ERROR"),MB_ICONERROR
  invoke GetLastError
  invoke wsprintf,addr szBuffer,addr szFmat,eax
  invoke MessageBox,NULL,addr szBuffer,addr szBuffer,0
  jmp eee
.endif
mov hFile,eax
invoke Sleep,5000
invoke CloseHandle,hFile
eee:
invoke ExitProcess,NULL
end start

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
再问一下,本地用windbg怎么用?
选了.local那里,还是会出现很长的一串英文。最后那里好像是0000001什么的~~
命令那里下面Debuggee not connected 连不上?
2009-12-1 16:24
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
pdeextobj->PServiceRegPath=*myregpath;
改成wcscpy(pdeextobj->PServiceRegPath,myregpath)试一下看看
2009-12-1 16:58
0
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
wcscpy(pdeextobj->PServiceRegPath,myregpath);
结构里定义了的是unicode_string,直接用这个编不过去。我改下结构再看下。

对了我的是ddl 2600的,比如这个也编不过的???NTSTATUS aa=....;这种声明同给值一起都不能过的???是否编译器太老了?
2009-12-1 17:05
0
雪    币: 202
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
对了。应是不能直接用*unicode的,,
谢谢楼上的。不过myregpath->Buffer这样也不行?

还有我之前是这样定义的PUNICODE_STRING PServiceRegPath;//reg path
指向unicode的指针也是有时有有时无的。

赋值那里直接用 myregpath的。

        RtlInitUnicodeString(&pdeextobj->PServiceRegPath,myregpath->Buffer);
我这样试也显不出来的。只有一个\reg
2009-12-1 17:09
0
游客
登录 | 注册 方可回帖
返回
//