uoiuoi
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2008-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1396回复:2

为什么调用StartService函数时,机器会重启???

楼主#
更多 发布于:2002-10-08 09:09
我编了一个小驱动mydriver1.sys,拷在系统目录下,在注册表中也加了键值。
调用OpenSCManger和OpenService都成功,但调用StartService时,PC自动重启。
SC_HANDLE m_hSCM =OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE m_hDriver =OpenService( m_hSCM, (LPCTSTR)\"mydriver1\", SERVICE_ALL_ACCESS);
DWORD nRet =StartService(m_hDriver, 0, NULL);
于是,我在mydriver1.sys的DriverEntry中设了断点DbgBreakPoint(),用softice单步调,没发现任何异常,驱动被成功安装。但是,如果不用softice调试,调用StartService时还是PC自动重启,

这是为什么???????????
代码框架如下:

typedef struct _DEVICE_EXTENSION
{
PDEVICE_OBJECT pDevice;

UNICODE_STRING ustrDeviceName;
UNICODE_STRING ustrSymLinkName;
......
......

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

extern \"C\" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{

DbgBreakPoint();

NTSTATUS Status ;
ULONG ulDeviceNumber = 0;

pDriverObject->DriverUnload = DriverUnload;


Status =CreateDevice(pDriverObject,ulDeviceNumber );


return STATUS_SUCCESS;

}

NTSTATUS CreateDevice ( IN PDRIVER_OBJECT pDriverObject,
IN ULONG ulDeviceNumber )
{
DbgBreakPoint();

NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PDEVICE_EXTENSION pDevExt;

UNICODE_STRING wszTem1;
RtlInitUnicodeString(&wszTem1,L\"\\\\Device\\\\LGLGLG\");
UNICODE_STRING wszTem2;
wszTem2.Length =0;
wszTem2.MaximumLength = 32;
wszTem2.Buffer=(PWSTR)ExAllocatePoolWithTag(PagedPool, wszTem2.MaximumLength , 1633);

NTSTATUS statusTem=RtlIntegerToUnicodeString(ulDeviceNumber,0,&wszTem2);


if (!NT_SUCCESS(statusTem))
return statusTem;

UNICODE_STRING devName;
devName.Length =wszTem1.Length + wszTem2.Length ;

devName.MaximumLength =devName.Length +2;
devName.Buffer =(PWSTR)ExAllocatePoolWithTag(PagedPool, devName.MaximumLength , 1633);
RtlCopyUnicodeString(&devName, (PUNICODE_STRING)&wszTem1);
RtlAppendUnicodeStringToString(&devName, (PUNICODE_STRING)&wszTem2);
devName.Buffer[ devName.Length /2] = UNICODE_NULL;

status =IoCreateDevice( pDriverObject,
sizeof(DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;

pDevObj->Flags |= DO_BUFFERED_IO;

ExFreePool( (PVOID)(wszTem2.Buffer ));

pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName=devName;

ULONG ulTem=ulDeviceNumber+1;

UNICODE_STRING wszTem3;
RtlInitUnicodeString(&wszTem3,L\"\\\\??\\\\LGLGLGsymLindName\");
UNICODE_STRING wszTem4;
wszTem4.Length =0;
wszTem4.MaximumLength = 32;
wszTem4.Buffer=(PWSTR)ExAllocatePoolWithTag(PagedPool, wszTem4.MaximumLength , 1633);

statusTem=RtlIntegerToUnicodeString(ulTem,0,&wszTem4);
if (!NT_SUCCESS(statusTem))
return statusTem;

UNICODE_STRING symLinkName;
symLinkName.Length =wszTem3.Length +wszTem4.Length ;
symLinkName.MaximumLength =symLinkName.Length +2;
symLinkName.Buffer =(PWSTR)ExAllocatePoolWithTag(PagedPool, symLinkName.MaximumLength , 1633);
RtlCopyUnicodeString(&symLinkName, (PUNICODE_STRING)&wszTem3);
RtlAppendUnicodeStringToString(&symLinkName, (PUNICODE_STRING)&wszTem4);
symLinkName.Buffer[ symLinkName.Length /2] = UNICODE_NULL;

pDevExt->ustrSymLinkName=symLinkName;

status = IoCreateSymbolicLink( &(UNICODE_STRING)symLinkName,
&(UNICODE_STRING)devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
ExFreePool( (PVOID)(wszTem4.Buffer ));

return STATUS_SUCCESS;
}

VOID DriverUnload ( IN PDRIVER_OBJECT pDriverObject )
{
DbgBreakPoint();

PDEVICE_OBJECT pNextObj;

pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL)
{
PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;

IoDeleteSymbolicLink(&pLinkName);
ExFreePool( (PVOID)(pDevExt->ustrSymLinkName.Buffer ));
ExFreePool( (PVOID)(pDevExt->ustrDeviceName.Buffer ));

pNextObj = pNextObj->NextDevice;
IoDeleteDevice( pDevExt->pDevice );
}

}
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-08 09:16
注册表中添了那些值? :D
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
uoiuoi
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2008-10-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-08 10:05
注册表文件如下:

REGEDIT4

[HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Services\\mydriver1]
\"Start\"=dword:3
\"Type\"=dword:1
\"ErrorControl\"=dword:1
\"DisplayName\"=\"Device Moner\"
游客

返回顶部