您的位置:首页 > 其它

使用bindview自动安装passthru驱动的调试笔记

2016-03-01 14:16 369 查看

1.21

整个软件的安装过程比较复杂,需要自动安装passthru.sys这个驱动。

在驱动开发网上搜索了一下,有很多人讲,不过根据bindview这个代码开发的自动安装的程序,居然可以看到原代码。太开心了,下载下载。

passthruinstall这个程序是需要DDK来编程的,我本来想把它的代码移植到VC6.0里面。可是需要的文件太麻烦,主要就是hid.h。可是包含了之后出现的大面积的参数定义错误让我始料不及,今天调试了一个下午,还是没有什么突破,还是算了,在ddk下进行调试吧。

我在2K的DDK以及XP的DDK都可以编译,还不错,没有出现问题。得到的passthruinstall.exe拷贝到一个安装目录:里面有netsf.inf netsf_m.inf passthru.sys 和 sfilter.dll. 这四个文件也是手工安装需要的四个文件,手工安装方面已经没有问题了。

运行程序却发现:提示没有找到设备信息集 错误0x800203 ,调试passthruinstall这个代码,发现是函数:InstallSpecifiedComponent失败,主函数入口是这样的:

DWORD InstallDriver_Passthru()

{

DWORD nResult;

TCHAR szFileFullPath[ _MAX_PATH ];

TCHAR szDrive[ _MAX_DRIVE ];

TCHAR szDir[ _MAX_DIR ];

TCHAR szDirWithDrive[_MAX_DRIVE+_MAX_DIR];

nResult = GetServiceInfFilePath_PassthruMP( szFileFullPath, MAX_PATH );

if( nResult == 0 )

{

//_tprintf( "Unable to get INF file path.\n") );

MessageBoxW(NULL, L"获取INF文件路径失败!", L"安装程序错误提示",MB_OK);

return 0;

}

//

// Get the path where the INF file is.

//

_wsplitpath( szFileFullPath, szDrive, szDir, NULL, NULL );

wcscpy( szDirWithDrive, szDrive );

wcscat( szDirWithDrive, szDir );

if ( !SetupCopyOEMInfW(

(PWSTR)szFileFullPath,

(PWSTR)szDirWithDrive, // Other files are in the

// same dir. as primary INF

SPOST_PATH, // First param is path to INF

0, // Default copy style

NULL, // Name of the INF after

// it's copied to %windir%\inf

0, // Max buf. size for the above

NULL, // Required size if non-null

NULL) // Optionally get the filename

// part of Inf name after it is copied.

)

{

MessageBoxW(NULL, L"复制 PasstruMP 的inf安装文件到系统目录失败!", L"安装程序错误提示",MB_OK);

}

//------------------------------------------------------------------------

nResult = GetServiceInfFilePath_Passthru( szFileFullPath, MAX_PATH );

if( nResult == 0 )

{

// _tprintf( "Unable to get INF file path.\n" );

MessageBoxW(NULL, L"获取INF文件路径失败!", L"安装程序错误提示",MB_OK);

return 0;

}

//_tprintf( "INF Path: %s\n", szFileFullPath );

HRESULT hr=S_OK;

//_tprintf( "PnpID: %s\n"), "ms_passthru");

WCHAR wszPassthru[] = L"ms_passthru" ;

///////////////////////////////////////////////////////////////////

//错误发生在这里

///////////////////////////////////////////////////////////////////

hr = InstallSpecifiedComponent(

(LPWSTR)szFileFullPath, //驱动安装的inf文件路径 , 适当修改吧

(LPWSTR)wszPassthru, // NDISPROT_SERVICE_PNP_DEVICE_ID, //这个也要适当修改的

pguidNetClass[1] //NDIS Protocal 类型

);

if( hr != S_OK )

{

/*ErrMsg( hr, L"InstallSpecifiedComponent\n" );*/

MessageBoxW(NULL, L"ESC安装驱动失败!", L"安装程序错误提示",MB_OK);

}else

{

MessageBoxW(NULL, L"ESC成功安装驱动!", L"安装程序提示",MB_OK);

}

return 0;

}

怎么会呢,因为InstallSpecifiedComponent这个函数在component.cpp里面定义的很清楚,我于是比较了XP DDK里面标准的bindview里面的component.cpp 与 passthruinstall文件里面的component.cpp,发现是一样一样的,问题可能出现在参数上,明天继续

1.22

非常不幸的是,参数都是正确的,每一个路径和copy的过程都是对的。

在网络上搜索,看到一篇文章:说使用自动程序安装中间层驱动为什么会失败的事情,是因为netsf.inf标准的inf是这样的:

[MSFT]

%Passthru_Desc% = Passthru.ndi, ms_passthru

[Passthru.ndi]

AddReg = Passthru.ndi.AddReg, Passthru.AddReg

Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!

CopyFiles = Passthru.Files.Init, Passthru.Files.Sys

CopyInf = netsf_m.inf

; File copy

;

[SourceDisksNames]

1=%DiskDescription%,"",,

[SourceDisksFiles]

passthru.dll=1

passthru.sys=1

netsf_m.inf=1

[DestintionDirs]

DefaultDestDir = 12

Passthru.Files.Init = 11 ; %windir%\System32

Passthru.Files.Sys = 12 ; %windir%\System32\drivers

; Copying of passthru.dll is required only if the filter has a Notify object

[Passthru.Files.Init]

passthru.dll,,,2

[Passthru.Files.Sys]

passthru.sys,,,2

但是,由于这一块代码有问题:

...

[Passthru.ndi]

AddReg = Passthru.ndi.AddReg, Passthru.AddReg

Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!

CopyFiles = Passthru.Files.Init, Passthru.Files.Sys

CopyInf = netsf_m.inf

...

CopyInf这个文件需要把netsf_m.inf拷贝到系统下,但是这个函数有时候会出现失败的现象:需要使用上面一样的拷贝方式,于是需要把这一段代码修改成这样:

...

[Passthru.ndi]

AddReg = Passthru.ndi.AddReg, Passthru.AddReg

Characteristics = 0x4490 ; NCF_HAS_UI | NCF_FILTER | NCF_NO_SERVICE | NCF_NDIS_PROTOCOL !--Filter Specific--!!

CopyFiles = Passthru.Files.Init, Passthru.Files.Sys ,Passthru.Files.inf

;CopyInf = netsf_m.inf

;被隐藏了

....

同时需要把相关的代码调整

...

[SourceDisksFiles]

sfilter.dll=1

passthru.sys=1

;增加了这一句

netsf_m.inf=1

[DestinationDirs]

DefaultDestDir = 12

SFilter.CopyFiles.Init = 11 ; %windir%\System32

SFilter.CopyFiles.Sys = 12 ; %windir%\System32\drivers

;增加了这一句

SFilter.CopyFiles.Inf = 17 ; %windir%\inf

; Copying of sfilter.dll is required only if the filter has a Notify object

[SFilter.CopyFiles.Init]

sfilter.dll,,,2

[SFilter.CopyFiles.Sys]

passthru.sys,,,2

;增加了这一部分

[SFilter.CopyFiles.Inf]

netsf_m.inf,,,2

...

修改实际上就是使用一样的方式拷贝。

OK,修改完毕,继续使用passthruinstall.exe。错误解决了,但是...什么? 需要passthru.dll? 那里有passthru.dll?我只有sfilter.dll。。。。

仔细修改netsf.inf程序,发现真的有代码需要使用passthru.dll,

...

HKR, Ndi, ComponentDll, , passthru.dll

...

可是我在编译的过程中根本没有产生passthru.dll,难道需要在上层进行编译,产生passthru.dll?

于是有了一个邪恶的念头,就是passthru.dll是不是和sfilter.dll是一个呢。,我改,不就是一个名字吗,结果居然安装显示成功了....赶紧测试程序,却发现, 上层软件不起作用了,发送的命令根本没有被驱动执行......

1.23

我决定一点一点的修改netsf.inf,把里面的名字都修改成sfilter,这样就应该不需要passthru.dll了吧,结果跟我预料的相同,但是在启动上层软件的时候出了问题:不能打开接口,提示Creatfile()失败。。。

整个疯掉了,而且系统出了问题:当出现安装成功却不能控制的时候,接下来怎么卸载也没有用处了。手工安装也不行了,重启也不行了,安装系统吧。

幸好有ghost..因为听说调试驱动会坏系统,做好了完全的准备.....

今天重装了11次系统,发现了一个规律,当我使用passthru名字的时候,需要passthru.dll可以安装成但是不能使用,修改成sfilter时候,安装成功但是不能打开文件。

于是我回到passthru里面,

1,在passthru.c里面有DriverEntry()函数,发现了

RtlInitUnicodeString(&nameString, L"\\Device\\MyPassthru" );

RtlInitUnicodeString(&linkString, L"\\??\\MyPassthru");

说明入口是MyPassthru

2,在上层切换软件里面,有这样的函数

creatfile("\\\\.\\Mypassthru"...);

就是说要打开这样的接口...

3,于是又回到bindview.cpp

发现有这样一句:

WCHAR wszPassthru[] = L"ms_passthru";

需要passthru,可能也是需要passthru.dll, 我只有sfilter.dll,一般dll都会提供接口函数,是不是需要改变一下?

修改bindview.cpp里面的这一句:

WCHAR wszPassthru[] = L"ms_sfilter";

为什么不修改1 ,2呢,因为1,2是约定接口的,而且我也不确定passthru.dll这个我修改的文件是否有用了。

编译,生成passthruinstall.exe,去掉无聊的passthru.dll,把netsf.inf修改成使用sfilter名字...出现了梦寐以求的数字签名.OK,使用上层软件打开,OK,然后控制,也OK

整个世界清静了。

结论:改netsf.inf 以及 bindview。

继续开发了自动卸载的程序,但是卸载的时候出现了蓝屏,不怕不怕,慢慢来......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: