nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1425回复:13

动态卸载出错

楼主#
更多 发布于:2005-01-10 16:50
我的驱动是windowsxp下用windowsxp ddk编译的
动态加载成功,但是动态卸载时失败,返回0
GetLastError返回的错误码:
1052L ERROR_INVALID_SERVICE_CONTROL         请求的控件对此服务无效

我用的卸载函数是ControlService(m_sService,SERVICE_CONTROL_STOP,&Service_Status);
对么?驱动的unload例程也没有被调用

代码如下
m_sService = CreateService(...)//成功
m_sService = OpenService(..., SERVICE_ALL_ACCESS);//成功
StartService(m_sService, 0, NULL);//成功
。。。。。。。。。。。。。。//Createfile等操作 成功
ControlService(m_sService,SERVICE_CONTROL_STOP,&Service_Status);//失败!!!
返回 0
1052L ERROR_INVALID_SERVICE_CONTROL         请求的控件对此服务无效


大家帮忙看看 谢谢!!!

[编辑 -  1/10/05 by  nimingren]
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-10 17:49
你用StartService启动服务之后,看看服务是否真的运行了
bResult = WaitForState(SERVICE_RUNNING, &serviceStatus);

在交流中学习。。。
jgw2008
驱动小牛
驱动小牛
  • 注册日期2004-12-16
  • 最后登录2005-12-20
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望8点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-10 17:51
具体出错原因可以用SoftIce+DriverVerifier得到,跟踪试试,很灵的^_^
Best Wishes to you! MSN: jgw2008@hotmail.com E-Mail: jgw2008@126.com
nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-10 18:41
谢谢 楼上两位大哥
StartService 后我用调用DeviceIoCtrol 得到了响应
应该是启动了吧
 SoftIce+DriverVerifier 咋用啊 我是第一次作驱动
我的驱动就是为了进入ring0 不是真的要控制硬件
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-11 08:59
谢谢 楼上两位大哥
StartService 后我用调用DeviceIoCtrol 得到了响应
应该是启动了吧
 SoftIce+DriverVerifier 咋用啊 我是第一次作驱动
我的驱动就是为了进入ring0 不是真的要控制硬件

这个问题本身不复杂的,你还是好好检查一下吧。
在交流中学习。。。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2005-01-11 09:00
把你驱动贴出来看看.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-11 15:16
大侠们帮忙看看  
exe 代码:
#include <stdio.h>
#include <io.h>
#include "windows.h"

#include <string>
using namespace std;
int main()
{
string strDeviceName="MyFunc11c";
char path[256]="";
GetSystemDirectory(path, 256);
string strDriverName=path;
strDriverName += "\\drivers\\";
strDriverName += "wdm11c.sys";

SERVICE_STATUS Service_Status;
SC_HANDLE m_sManager= OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

SC_HANDLE m_sService = CreateService(
m_sManager,
strDeviceName.c_str(),
strDeviceName.c_str(),
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL,
strDriverName.c_str(),
NULL, NULL, NULL, NULL, NULL);
m_sService = OpenService(m_sManager, strDeviceName.c_str(), SERVICE_ALL_ACCESS);


if (StartService(m_sService, 0, NULL) == 0)
{
printf("start fail\n");
}
Sleep(1000);

int i = ControlService(m_sService,SERVICE_CONTROL_STOP,&Service_Status);
if(i==0)
{
printf("stop fail\n");
}

return 0;
}

驱动:
#ifdef __cplusplus
extern "C"
{
#endif

#include "wdm.h"
#ifdef __cplusplus
}
#endif

/////////////////////////////////////////////////////////////////////////////
// DebugPrint and Guid headers
#include "debugprint.h"
#define DGL_DEVICE_NAME L"\\Device\\My11c"
#define DOS_DEVICE_NAME L"\\DosDevices\\MyFunc11c"



typedef struct _MyFUNC_DEVICE_EXTENSION
{
PDEVICE_OBJECT fdo;
PDEVICE_OBJECT NextStackDevice;
UNICODE_STRING ifSymLinkName;

} MyFUNC_DEVICE_EXTENSION, *PMyFUNC_DEVICE_EXTENSION;

NTSTATUS CompleteIrp( PIRP Irp, NTSTATUS status, ULONG info)
{
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = info;
IoCompleteRequest(Irp,IO_NO_INCREMENT);
return status;
}
NTSTATUS MyFuncCreate( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
// DebugPrint( "Create File is %T", &(IrpStack->FileObject->FileName));
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}
NTSTATUS MyFuncClose( IN PDEVICE_OBJECT fdo,
IN PIRP Irp)
{
// DebugPrintMsg("MyFuncClose");
return CompleteIrp(Irp,STATUS_SUCCESS,0);
}

#pragma code_seg("PAGE") // start PAGE section

VOID MyFuncUnload(IN PDRIVER_OBJECT DriverObject)
{
DebugPrintMsg("MyFuncUnload");
UNICODE_STRING DOSDeviceName;
RtlInitUnicodeString(&DOSDeviceName, DOS_DEVICE_NAME);

IoDeleteSymbolicLink(&DOSDeviceName);
IoDeleteDevice(DriverObject->DeviceObject);

// DebugPrintClose();
}

//////////////////////////////////////////////////////////////////////////////
#pragma code_seg() // end PAGE section

#pragma code_seg("INIT") // start INIT section


extern "C"
NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
#if DBG
DebugPrintInit("FtFunc checked");
#else
DebugPrintInit("FtFunc free");
#endif
DebugPrintMsg("DriverEntry begin");
NTSTATUS status = STATUS_SUCCESS;

PDEVICE_OBJECT fdo;

UNICODE_STRING NtDeviceName;
UNICODE_STRING Win32DeviceName;

RtlInitUnicodeString(&NtDeviceName,DGL_DEVICE_NAME);
RtlInitUnicodeString(&Win32DeviceName,DOS_DEVICE_NAME);

// Create our Functional Device Object in fdo
status = IoCreateDevice (DriverObject,
sizeof(MyFUNC_DEVICE_EXTENSION),
&NtDeviceName, // Name
FILE_DEVICE_UNKNOWN,
0,
FALSE, // Not exclusive
&fdo);
if( !NT_SUCCESS(status))
return status;

// Create device name
status = IoCreateSymbolicLink(&Win32DeviceName,&NtDeviceName );
if( !NT_SUCCESS(status))
return status;

DriverObject->DriverUnload = MyFuncUnload;
DriverObject->MajorFunction[IRP_MJ_CREATE] = MyFuncCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = MyFuncClose;

DebugPrintMsg("DriverEntry completed");

return status;
}
#pragma code_seg() // end INIT section



fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-11 16:28
我作了简单的修改,试了一下好像没什么问题的。
附件是我生成的sys。
附件名称/大小 下载次数 最后更新
2005-01-11_wdm11c.sys (4KB)  12
在交流中学习。。。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-11 16:36
修改的源码也一起给你把,结果我直接输出到DbgView的。
附件名称/大小 下载次数 最后更新
2005-01-11_hehe.rar (20KB)  39
在交流中学习。。。
nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-11 17:54
修改的源码也一起给你把,结果我直接输出到DbgView的。
 

用了你的驱动 果然没有错误了!!
但是 如果我编译你的那个驱动文件 就又不能unload了
可能是我的source错了 是不是设置的不对?
我的是
TARGETNAME=Wdm11a
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(BASEDIR)\inc;

SOURCES= Sys_Driver.c\


NTTARGETFILES=PostBuildSteps

非常感谢!!
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-01-12 10:11
我编译没有用source文件,source文件我不是很熟悉。
哪位帮着看看吧。
在交流中学习。。。
nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-01-12 10:27
我编译没有用source文件,source文件我不是很熟悉。
哪位帮着看看吧。

这种办法我不会啊  你怎么编译的
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2005-01-12 11:48
把DRIVERTYPE=WDM
去掉
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
nimingren
驱动牛犊
驱动牛犊
  • 注册日期2005-01-10
  • 最后登录2005-02-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-01-12 12:30
把DRIVERTYPE=WDM
去掉

^_^  解决  开心  多谢
游客

返回顶部