beckhamwu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2027回复:10

请问:如何通过打抱软件(安装程序)来安装驱动程序啊?

楼主#
更多 发布于:2003-06-27 10:30
请问:
    关于如何通过打抱软件(安装程序)来安装驱动程序啊?
请各位帮忙!

最新喜欢:

blueairblueai... baoyibao99baoyib...
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-27 13:52
题 Win2K 下动态加载驱动程序
这个可能对你有帮组!!!
加载一个驱动程序,主要就是,在
SYSTEMCurrentControlSetServices 建一个键。
如:
SYSTEMCurrentControlSetServicesTwdm1
Type(1)
ErrorControl(0)
Start(3)

多数驱动程序都是通过设置 Start 的值为 0, 1, 2 。
在系统启动的过程中加载驱动程序。

在 win2k 下驱动程序的加载处理上述方式外,
还可以在应用程序里用 Service Api 实现,驱动程序的动态加载。
这时候的 Start 为 3 。

所用到的 Api 为:
OpenSCManager, CreateService, OpenService, StartService
ControlService, DeleteService, CloseServiceHandle

其中需要说明的是:
CreateService :他通过参数在注册表里自动创建驱动程序需要的键值。
DeleteService :他自动删除驱动程序在注册表里创的键值。

下面是一个,简单的例子:

应用程序:

#include \"stdafx.h\"
#include <windows.h>
#include <winsvc.h>
#include <conio.h>

void DelSvr( char * szSvrName ); //自动卸载驱动程序。

int main(int argc, char* argv[])
{
HANDLE hWdm;
printf(\"Hello World!n\");

SC_HANDLE hServiceMgr, hServiceTwdm;
BOOL bRtn;
DWORD dwRtn, dwSize = 256;
char szDir[256];

if( argc > 1 ) //加任一个参数表示卸载驱动程序。
{
DelSvr( \"Twdm1\" );
return 0;
}

GetCurrentDirectory( dwSize, szDir );//取当前目录
strcat( szDir, \"\\Twdm.sys\" ); //取驱动程序的全路径

LPCTSTR lpszBinaryPathName = TEXT(szDir);
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); //打开服务控制管理器

if( hServiceMgr == NULL )
{
printf( \"OpenSCManager() Faild %d ! n\", GetLastError() );
return 0;
}
else
{
printf( \"OpenSCManager() ok ! n\" );
}

hServiceTwdm = CreateService( hServiceMgr,
TEXT(\"Twdm1\"), //SYSTEMCurrentControlSetServices 驱动程序的在注册表中的名字
TEXT(\"Twdm1\"), // 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
lpszBinaryPathName, // 注册表驱动程序的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);

if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{
CloseServiceHandle( hServiceMgr );
printf( \"CrateService() Faild %d ! n\", dwRtn );
return 0;
}
else
{
printf( \"CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! n\" );
}

// 驱动程序已经加载,只需要打开
hServiceTwdm = OpenService( hServiceMgr, TEXT(\"Twdm1\"), SERVICE_ALL_ACCESS );
if( hServiceTwdm == NULL )
{
dwRtn = GetLastError();
CloseServiceHandle( hServiceMgr );
printf( \"OpenService() Faild %d ! n\", dwRtn );
return 0;
}
else
{
printf( \"OpenService() ok ! n\" );
}
}
else
{
printf( \"CrateService() ok ! n\" );
}

// 启动驱动程序,调用驱动程序的 DriverEntry 函数
bRtn = StartService( hServiceTwdm, NULL, NULL );
if( !bRtn )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )
{
printf( \"StartService() Faild %d ! n\", dwRtn );
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return 0;
}
else
{
if( dwRtn != ERROR_IO_PENDING )
{
printf( \"StartService() Faild ERROR_IO_PENDING ! n\");
}
else
{
printf( \"StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! n\");
}
}
}

//测试驱动程序
hWdm = CreateFile(\"\\\\.\\Twdm1\",
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if( hWdm != INVALID_HANDLE_VALUE )
{
printf( \"Open Driver Twdm ok ! n\" );
}
else
{
printf( \"Open Driver Twdm faild %d ! n\", GetLastError() );
}
CloseHandle( hWdm );
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );

//这时候你可以通过注册表,或其他查看符号连接的软件验证。
printf( \"按任意键 卸载驱动程序 !n\" );
getch();
//卸载驱动程序。
DelSvr( \"Twdm1\" );
return 0;
}

//卸载驱动程序。
void DelSvr( char * szSvrName )
{
SC_HANDLE hServiceMgr, hServiceTwdm;
SERVICE_STATUS SvrSta;
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
{
printf( \"DelSvr::OpenSCManager() Faild %d ! n\", GetLastError() );
return;
}
else
{
printf( \"DelSvr::OpenSCManager() ok ! n\" );
}
hServiceTwdm = OpenService( hServiceMgr, TEXT(szSvrName), SERVICE_ALL_ACCESS );

if( hServiceTwdm == NULL )
{
CloseServiceHandle( hServiceMgr );
printf( \"DelSvr::OpenService() Faild %d ! n\", GetLastError() );
return;
}
else
{
printf( \"DelSvr::OpenService() ok ! n\" );
}
//停止驱动程序,如果停止失败,只有重新启动才能,再动态加载。
if( !ControlService( hServiceTwdm, SERVICE_CONTROL_STOP , &SvrSta ) )
{
printf( \"DelSvr::ControlService() Faild %d !n\", GetLastError() );
}
else
{
printf( \"DelSvr::ControlService() ok !n\" );
}
//动态卸载驱动程序。
if( !DeleteService( hServiceTwdm ) )
{
printf( \"DelSvr:eleteSrevice() Faild %d !n\", GetLastError() );
}
else
{
printf( \"DelSvr:eleteSrevice() ok !n\" );
}
CloseServiceHandle( hServiceTwdm );
CloseServiceHandle( hServiceMgr );
return;
}

驱动程序:驱动程序很简单,
只有一个文件,实现了DriverEntry,DispatchCreate,DispatchClose,GpdUnload 四个函数。

#include <ntddk.h>

#define NT_DEVICE_NAME L\"\\Device\\Twdm1\"
#define DOS_DEVICE_NAME L\"\\DosDevices\\Twdm1\"

NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath );
NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp);
NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp);
VOID GpdUnload(PDRIVER_OBJECT DriverObject);

//////////////////////
PDEVICE_OBJECT fdo;
BOOLEAN fSymbolicLink;


NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
{

//UNREFERENCED_PARAMETER (RegistryPath);
NTSTATUS status;
UNICODE_STRING ntDeviceName;
UNICODE_STRING win32DeviceName;

DbgPrint( \"TWDM: DriverEntry for Twdm.sys ...... n\" );
fSymbolicLink = FALSE;

//
// Create dispatch points for the IRPs.
//

DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
//DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = GpdDispatch;
DriverObject->DriverUnload = GpdUnload;
//DriverObject->MajorFunction[IRP_MJ_PNP] = GpdDispatchPnp;
//DriverObject->MajorFunction[IRP_MJ_POWER] = GpdDispatchPower;
//DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = GpdDispatchSystemControl;
//DriverObject->DriverExtension->AddDevice = GpdAddDevice;

RtlInitUnicodeString(&ntDeviceName, NT_DEVICE_NAME);

//创建设备
status = IoCreateDevice(DriverObject,
0,
&ntDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&fdo);

if (!NT_SUCCESS (status))
{
DbgPrint( \"TWDM: IoCreateDevice() faild ! n\" );
}
else
{
DbgPrint( \"TWDM: IoCreateDevice() ok ! n\" );
RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);

//创建符号连接
status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName );
if (!NT_SUCCESS(status))
{
DbgPrint( \"TWDM: IoCreateSymbolicLink() faild ! n\" );
}
else
{
DbgPrint( \"TWDM: IoCreateSymbolicLink() ok ! n\" );
fSymbolicLink = TRUE;
}
fdo->Flags &= ~DO_DEVICE_INITIALIZING;
}

if (!NT_SUCCESS(status))
{
if(fdo)
{
IoDeleteDevice(fdo);
}
if(fSymbolicLink)
{
IoDeleteSymbolicLink(&win32DeviceName);
}
}
return status;
}

NTSTATUS DispatchCreate(PDEVICE_OBJECT fdo, PIRP Irp)
{
NTSTATUS status;
DbgPrint( \"TWDM: IRP_MJ_CREATE for Twdm.sys ...... n\" );
status = STATUS_SUCCESS;
return status;
} // DispatchCreate

NTSTATUS DispatchClose(PDEVICE_OBJECT fdo, PIRP Irp)
{ // DispatchClose
NTSTATUS status;
DbgPrint( \"TWDM: IRP_MJ_CLOSE for Twdm.sys ...... n\" );
status = STATUS_SUCCESS;
return status;
} // DispatchClose

VOID GpdUnload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING win32DeviceName;

DbgPrint( \"TWDM: GpdUnload() for Twdm.sys ...... n\" );

RtlInitUnicodeString(&win32DeviceName, DOS_DEVICE_NAME);
if(fdo)
{
IoDeleteDevice(fdo);
}
if(fSymbolicLink)
{
IoDeleteSymbolicLink(&win32DeviceName);
}
}


http://www.driverdevelop.com/forum/viewthread.php?tid=4055#


 
放弃瘟草,现吃李草
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-29 20:08
他说的是打包安装拉。。
你的是动态加载。。

自己写或者网上当个打包软件 ,安装是将驱动拷贝到系统目录 ,向注册表中添加以驱动名称为键值的键然后加入
Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
lpszBinaryPathName, // 注册表驱动程序的 ImagePath

之类的拉。。
现在的打包软件基本上都有这些功能的
鬼啊~~~~~~~~
netbeecc
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-30 09:41
将snetcfg做成一个DLL,在InstallShield中调用
king229
驱动中牛
驱动中牛
  • 注册日期2003-04-29
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-30 19:20
我一直不太清楚*.inf文件到底做了多少事 说说吧
鬼啊~~~~~~~~
beckhamwu
驱动牛犊
驱动牛犊
  • 注册日期2003-04-09
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-02 02:34
你还没睡啊,QQ号码是多少聊聊



--------------------------------------
我发现你在线!!!
square
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-10-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-07 11:13
wise install

直接调用snetcfg不就可以了
netbeecc
驱动牛犊
驱动牛犊
  • 注册日期2002-09-29
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望8点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-07-07 17:37
直接调用snetcfg.exe会在安装时弹出DOS窗口,不爽,做成DLL就不会弹出DOS窗口了
blueair
驱动牛犊
驱动牛犊
  • 注册日期2003-08-20
  • 最后登录2003-09-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-08-22 16:06
关注,学习
生命在于运动! 思想在于交流!
melodylux
驱动牛犊
驱动牛犊
  • 注册日期2003-07-09
  • 最后登录2010-07-19
  • 粉丝0
  • 关注0
  • 积分15分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-08-28 19:10
大虾们,能说清楚一些吗?比如贴个关键代码什么的?小弟很不了解,有这方面的书吗?
flyegg
驱动牛犊
驱动牛犊
  • 注册日期2003-07-17
  • 最后登录2004-04-23
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-08-30 17:00
用snetcfg.exe 读入过滤器服务驱动INF文件安装驱动,结果出错了。好象是Install()时出的错。hr返回的是-2146500093,查不出原因。
郁闷呀。
还请高手们多指点

[编辑 -  8/30/03 by  flyegg]

[编辑 -  8/30/03 by  flyegg]
游客

返回顶部