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。
继续开发了自动卸载的程序,但是卸载的时候出现了蓝屏,不怕不怕,慢慢来......