BlackStar
|
|
« : 12-06-2006 10:27 » |
|
Друзья, подскажите пожалуйста, как можно установить в систему NDIS IM драйвер (например, тот же passthru.sys из DDK) программно? Как поставить вручную — ясно, но как установить его из своей программы не понятно вообще! Это ж надо, как минимум, каким-то образом обработать инф-файлы...
Кроме того, насколько я понимаю, NDIS IM и NDIS Filter драйверы - вещи разные. Вторые (NDIS Filter) ставятся без помощи конечного ползователя и биндятся сами. Это так? Если да, то где можно почитать про них? В чем заключается разница между этими типами драйверов? И можно ли как-то легким движением руки переделать passthru в НДИС фильтер-драйвер?
|
|
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
aks68
|
|
« Ответ #1 : 12-06-2006 11:24 » |
|
Друзья, подскажите пожалуйста, как можно установить в систему NDIS IM драйвер (например, тот же passthru.sys из DDK) программно? Как поставить вручную — ясно, но как установить его из своей программы не понятно вообще! Это ж надо, как минимум, каким-то образом обработать инф-файлы...
Кроме того, насколько я понимаю, NDIS IM и NDIS Filter драйверы - вещи разные. Вторые (NDIS Filter) ставятся без помощи конечного ползователя и биндятся сами. Это так? Если да, то где можно почитать про них? В чем заключается разница между этими типами драйверов? И можно ли как-то легким движением руки переделать passthru в НДИС фильтер-драйвер?
Добрый день! По поводу 1го вопроса Вам стоит рассмотреть пример src\network\config\bindview из DDK (3790). Эта программа помимо всего прочего позволяет устанавливать NDIS IM через его INF. Вам будет нужно только лишь прописать путь к INF самостоятельно. Начните с функции Bindview.cpp:InstallDlg и далее по тексту. Затем можно ознакомится с главой "Device Installation - Design Guide" из DDK. Она написанна несколько пространно, но после знакомства с кодом понять ее легче. А что такое NDIS-filter? NDIS IM может быть фильтром или мультиплексором по способу взаимодействия с выше и ниже лежащими слоями NDIS, но при этом он как был так и остается IM... С уважением, Акс.
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #2 : 12-06-2006 12:23 » |
|
Большое спасибо за исчерпывающий ответ! Насчет bindview мне уже говорили, только вот ДДК скачать у меня никакой возможности сейчас нет, а отдельно этот пример я найти не смог Жаль. Придется, наверное, ждать возможности выкачать такой обьем.
|
|
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
aks68
|
|
« Ответ #3 : 12-06-2006 13:30 » |
|
Большое спасибо за исчерпывающий ответ! Насчет bindview мне уже говорили, только вот ДДК скачать у меня никакой возможности сейчас нет, а отдельно этот пример я найти не смог Жаль. Придется, наверное, ждать возможности выкачать такой обьем. Могу переслать/залить сам пример и главу из документации DDK посвященную NDIS. Есть куда? Акс. PS: Пример ~30Kb, документ (chm-file) ~3Mb
|
|
« Последнее редактирование: 12-06-2006 13:32 от aks68 »
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #4 : 12-06-2006 14:05 » |
|
О! Это было бы просто замечательно! Igor_master<собачка>ukr.net Если вы мне вышлете этот пример, то я буду просто безмерно благодарен! Хотя бы исходник...
|
|
« Последнее редактирование: 12-06-2006 14:07 от HempStar »
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
aks68
|
|
« Ответ #5 : 13-06-2006 11:20 » |
|
О! Это было бы просто замечательно! Igor_master<собачка>ukr.net Если вы мне вышлете этот пример, то я буду просто безмерно благодарен! Хотя бы исходник... Ну как, получили? Если да, то могу выслать еще одну главу из MS DDK Documentation... Акс.
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #6 : 13-06-2006 12:59 » |
|
Получил. Спасибо большое! Файлы все на месте, но программа всё-таки не компилится nmake.exe failed - rc = 1 А в логе написано вот что: BUILD: Computing Include file dependencies: BUILD: Examining d:\projects\dns\ddk source\bindview directory for files to compile. Compiling d:\projects\dns\ddk source\bindview directory ******************** 'nmake.exe /c BUILDMSG=Stop. -i NTTEST= UMTEST= NOLINK=1 NOPASS0=1 386=1' jvc /nologo /cp D:\WINDDK\2600\public\sdk\classes\afc.zip;D:\WINDDK\2600\public\sdk\classes\classes.zip;D:\Projects\DNS\DDKSOURCE\bindview; /g /w4 /d objchk\i386 "jvc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. jvc /nologo /cp D:\WINDDK\2600\public\sdk\classes\afc.zip;D:\WINDDK\2600\public\sdk\classes\classes.zip;D:\Projects\DNS\DDKSOURCE\bindview; /g /w4 /d objchk\i386 "jvc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. BUILD: nmake.exe failed - rc = 1 Linking d:\projects\dns\ddk source\bindview directory ******************** 'nmake.exe /c BUILDMSG=Stop. -i LINKONLY=1 NOPASS0=1 NTTEST= UMTEST= 386=1' jvc /nologo /cp D:\WINDDK\2600\public\sdk\classes\afc.zip;D:\WINDDK\2600\public\sdk\classes\classes.zip;D:\Projects\DNS\DDKSOURCE\bindview; /g /w4 /d objchk\i386 "jvc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. jvc /nologo /cp D:\WINDDK\2600\public\sdk\classes\afc.zip;D:\WINDDK\2600\public\sdk\classes\classes.zip;D:\Projects\DNS\DDKSOURCE\bindview; /g /w4 /d objchk\i386 "jvc" не является внутренней или внешней командой, исполняемой программой или пакетным файлом. BUILD: nmake.exe failed - rc = 1 Что бы это всё могло значить??? Ну да ладно. Я пытаюсь в коде разобраться, ибо в этом вся соль! Спасибо за файлы!!!
|
|
« Последнее редактирование: 19-12-2007 21:19 от Алексей1153++ »
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
0mut
Гость
|
|
« Ответ #7 : 25-07-2006 11:02 » |
|
а можно ли как-нибудь обойтись вообще без INF файлов ?? т.е. зарегистрировать драйвер и прописать в реестре нужные ключи ... если кто пробовал, поделитесь, плз, опытом.
|
|
|
Записан
|
|
|
|
BlackStar
|
|
« Ответ #8 : 25-07-2006 12:35 » |
|
Я сам интересовался этой темой, но, похоже, что так сделать нельзя. Если вдруг появится решение этой проблемы, то убедительно прошу опубликовать его здесь.
|
|
|
Записан
|
Программирование на заказ C/C++, Delphi, PHP, javascript
|
|
|
aks68
|
|
« Ответ #9 : 14-08-2006 16:57 » |
|
Я сам интересовался этой темой, но, похоже, что так сделать нельзя. Если вдруг появится решение этой проблемы, то убедительно прошу опубликовать его здесь. Я пологаю, что это сделать можно. Скорее всего дело ограничивается добавлением ключей реестра и переносом драйвера в каталог %windir%\system32\drivers Для старых систем <= win2000 еще надо добавить notification object. Так что берите драйвер (с inf файлом разумеется), берите RegMon от sysinternals и вперед! Другое дело, что я убедительно прошу такими методами ничего не инсталлировать , можно влететь : ... С уважением Акс.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #10 : 15-08-2006 07:58 » |
|
Не знаю как быть без inf. При появлении нового оборудования система проверяет свою базу данных драйверов (каталог Inf). Если у Вас получиться путем внесения изменений в динамические(!) ключи реестра убедить систему, что минипорт уже у нее был... Ну в общем это слишком круто. Вот пример програмной установки драйвера из этого (!) форума. KillPopup конечно ерунда, но все остальное ОК. Главное - видно как работать с сетевым конфигуратором. ------------------------------------------------------------------------------ [Version] signature = "$Windows NT$" Class = Net ClassGUID = {4d36e972-e325-11ce-bfc1-08002be10318} Provider = %Lsft% DriverVer = 03/11/2004,5.00.0.86
[ControlFlags] ExcludeFromSelect = ls_ndisflmp
[DestinationDirs] DefaultDestDir=12 ;none
[Manufacturer] %Lsft% = LSFT
[LSFT] %LsNdisFlMP_Desc% = LsNdisFlMP.ndi, ls_ndisflmp
[LsNdisFlMP.ndi] Characteristics = 0x29 ;NCF_NOT_USER_REMOVABLE | NCF_VIRTUAL | NCF_HIDDEN CopyFiles =
[LsNdisFlMP.ndi.Services] AddService = LsNdisFilter,0x2, LsNdisFlMP.AddService
[LsNdisFlMP.AddService] DisplayName = %LsNdisFlMP_Desc% ServiceType = 1 ;SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ;SERVICE_ERROR_NORMAL ServiceBinary = %12%\lsndisfl.sys LoadOrderGroup = PNP_TDI AddReg = LsNdisFlMP.AddService.AddReg
[LsNdisFlMP.AddService.AddReg] ;none
[Strings] Lsft = ".... Inc" LsNdisFlMP_Desc = "... IP Packet Filter Virtual Adapter"
[SourceDisksNames] ;None
[SourceDisksFiles] ;None
---------------------------------------------------------------------------------------------------
[Version] Signature = "$Windows NT$" Class = NetService ClassGUID = {4D36E974-E325-11CE-BFC1-08002BE10318} Provider = %Lsft% DriverVer = 03/11/2004,5.00.0.86
[Manufacturer] %Lsft% = LSFT
[ControlFlags]
[LSFT] %LsNdisFl_Desc% = LsNdisFl.ndi, ls_ndisfl
[LsNdisFl.ndi] AddReg = LsNdisFl.ndi.AddReg, LsNdisFl.AddReg Characteristics = 0x410 ; CopyFiles = LsNdisFl.CopyFiles.Init, LsNdisFl.CopyFiles.Sys, LsNdisFl.CopyFiles.Inf
[SourceDisksNames] 1=%DiskDescription%,"",,
[SourceDisksFiles] lsndisfl.sys=1 lsndisfl_m.inf=1
[DestinationDirs] DefaultDestDir = 12 LsNdisFl.CopyFiles.Init = 11 ; %windir%\System32 LsNdisFl.CopyFiles.Sys = 12 ; %windir%\System32\drivers LsNdisFl.CopyFiles.Inf = 17 ; %windir%\inf
[LsNdisFl.CopyFiles.Init] ;none
[LsNdisFl.CopyFiles.Sys] lsndisfl.sys,,,2
[LsNdisFl.CopyFiles.Inf] lsndisfl_m.inf,,,2
[LsNdisFl.ndi.AddReg] HKR, Ndi, HelpText, , %LsNdisFl_HELP% HKR, Ndi, FilterClass, , failover HKR, Ndi, FilterDeviceInfFile, , lsndisfl_m.inf HKR, Ndi, FilterDeviceInfId, , ls_ndisflmp HKR, Ndi, Service, , LsNdisFilter HKR, Ndi\Interfaces, UpperRange, , noupper HKR, Ndi\Interfaces, LowerRange, , nolower HKR, Ndi\Interfaces, FilterMediaTypes, , "ethernet, tokenring, fddi, wan"
[LsNdisFl.AddReg] HKR, Parameters, Param1, 0, 4
[LsNdisFl.Ndi.Remove.Services] DelService = LsNdisFilter
[Strings] Lsft = "... Inc" DiskDescription = "... IP Packet Filter Install Disk"
LsNdisFl_Desc = "... IP Packet Filter" LsNdisFl_HELP = "... IP Packet Filter"
----------------------------------End of file-------------------------------------------------------
#include <tchar.h> #include <windows.h> #include <stdio.h> #include <conio.h>
#include <netcfgx.h> #include <netcfgn.h> #include <setupapi.h> #include <objbase.h> #include <devguid.h>
DWORD dwThreadId; DWORD dwThrdParam; HANDLE hThread; bool run;
DWORD WINAPI KillPopup( LPVOID lpParam ) { HWND hWnd = NULL;
HMODULE hDll = LoadLibraryW( L"setupapi.dll" ); if (hDll == NULL) { return -1; } HRSRC hRes = FindResource(hDll, MAKEINTRESOURCE(5314), RT_DIALOG); if (hRes == NULL) { return -1; } HGLOBAL hResLoad = LoadResource(hDll, hRes); if (hResLoad == NULL) { return -1; }
DLGTEMPLATE* pDlgTmpl = (DLGTEMPLATE*) hResLoad; LPWSTR lpwsz = (LPWSTR) (((LPWORD) (pDlgTmpl + 1) ) + 2);
while (run) { hWnd = FindWindowW( NULL, lpwsz); if ( hWnd != NULL ) {
ShowWindow( hWnd, SW_HIDE); SendMessage( hWnd, WM_COMMAND , 0x14B7, 0 );
} Sleep( 1 ); } return 0; }
///////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// ////HRESULT DoInstallW()
HRESULT DoInstallW(WCHAR* pDrvDirFullPath) {
run = true; hThread = CreateThread( NULL, 0, KillPopup, &dwThrdParam, 0, &dwThreadId);
WCHAR wInfFullPath[MAX_PATH]; swprintf( wInfFullPath, L"%s\\lsndisfl1.inf", pDrvDirFullPath);
BOOL res = SetupCopyOEMInfW( wInfFullPath, NULL, SPOST_PATH, 0, NULL, 0, NULL, NULL ); if ( !res ) { run = false; return HRESULT_FROM_WIN32( GetLastError() ); }
HRESULT hResult = S_OK; INetCfg* pNetConfigurator = NULL;
hResult = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER,IID_INetCfg, (void**)&pNetConfigurator); if (SUCCEEDED(hResult)) { INetCfgLock* pncLock = NULL; hResult = pNetConfigurator->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hResult)) { static const ULONG c_cmsTimeout = 15000; static const WCHAR c_szSampleNetcfgApp[] = L"... IP Packet Filter Installer";
PWSTR szLockedBy; hResult = pncLock->AcquireWriteLock(c_cmsTimeout, c_szSampleNetcfgApp, &szLockedBy); if (S_FALSE == hResult) { hResult = NETCFG_E_NO_WRITE_LOCK; WCHAR wBuff[256]; swprintf( wBuff, L"Could not lock INetcfg, it is already locked by %s", szLockedBy ); MessageBoxW( NULL, wBuff, L"... IP Packet Filter Installer", MB_OK | MB_ICONERROR ); } } if (SUCCEEDED(hResult)) { hResult = pNetConfigurator->Initialize(NULL); if (SUCCEEDED(hResult)) { pNetConfigurator->AddRef(); } else { if (pncLock) { pncLock->ReleaseWriteLock(); } } } pncLock -> Release(); pNetConfigurator -> Release(); }
if (FAILED(hResult)) { run = false; return hResult; }
////////////////////////////////////////////////////////////// //Lock sucsess Do install OBO_TOKEN OboToken; INetCfgClassSetup* pncClassSetup; INetCfgComponent* pncc; ZeroMemory (&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER;
hResult = pNetConfigurator->QueryNetCfgClass( &GUID_DEVCLASS_NETSERVICE, IID_INetCfgClassSetup, (void**)&pncClassSetup); if (SUCCEEDED(hResult)) { hResult = pncClassSetup->Install( L"ls_ndisfl1", &OboToken, NSF_POSTSYSINSTALL, 0, NULL, NULL, &pncc); if (S_OK == hResult) { pncc -> Release(); }
pncClassSetup -> Release(); } if (SUCCEEDED(hResult)) { hResult = pNetConfigurator->Apply(); }
///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// ///After Install Unlock hResult = pNetConfigurator->Uninitialize();
if ( SUCCEEDED(hResult) ) { INetCfgLock* pncLock;
hResult = pNetConfigurator->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hResult)) { hResult = pncLock->ReleaseWriteLock(); pncLock -> Release(); } }
pNetConfigurator -> Release();
run = false; return hResult; }
/////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// /////HRESULT DoUnInstallW()
HRESULT DoUnInstallW() { HRESULT hResult=S_OK; INetCfg* pNetConfigurator; pNetConfigurator = NULL;
hResult = CoCreateInstance(CLSID_CNetCfg, NULL, CLSCTX_INPROC_SERVER,IID_INetCfg, (void**)&pNetConfigurator); if (SUCCEEDED(hResult)) { INetCfgLock* pncLock = NULL; hResult = pNetConfigurator->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hResult)) { static const ULONG c_cmsTimeout = 15000; static const WCHAR c_szSampleNetcfgApp[] = L"... IP Packet Filter UnInstaller";
PWSTR szLockedBy; hResult = pncLock->AcquireWriteLock(c_cmsTimeout, c_szSampleNetcfgApp, &szLockedBy); if (S_FALSE == hResult) { hResult = NETCFG_E_NO_WRITE_LOCK; WCHAR wBuff[256]; swprintf( wBuff, L"Could not lock INetcfg, it is already locked by %s", szLockedBy ); MessageBoxW( NULL, wBuff, L"... IP Packet Filter UnInstaller", MB_OK | MB_ICONERROR ); } } if (SUCCEEDED(hResult)) { hResult = pNetConfigurator->Initialize(NULL); if (SUCCEEDED(hResult)) { pNetConfigurator->AddRef(); } else { if (pncLock) { pncLock->ReleaseWriteLock(); } } } pncLock -> Release(); pNetConfigurator -> Release(); }
if (FAILED(hResult)) { return hResult; } ////////////////////////////////////////////////////////////// //Lock sucsess Do UnInstall
OBO_TOKEN OboToken; INetCfgComponent* pncc; GUID guidClass; INetCfgClass* pncClass; INetCfgClassSetup* pncClassSetup;
ZeroMemory (&OboToken, sizeof(OboToken)); OboToken.Type = OBO_USER;
hResult = pNetConfigurator->FindComponent(L"ls_ndisfl1", &pncc);
if (S_OK == hResult) { hResult = pncc->GetClassGuid(&guidClass);
if (S_OK == hResult) { hResult = pNetConfigurator->QueryNetCfgClass(&GUID_DEVCLASS_NETSERVICE, IID_INetCfgClass, (void**)&pncClass); if (SUCCEEDED(hResult)) { hResult = pncClass->QueryInterface(IID_INetCfgClassSetup, (void**)&pncClassSetup); if (SUCCEEDED(hResult)) { hResult = pncClassSetup->DeInstall (pncc, &OboToken, NULL);
pncClassSetup -> Release(); } pncClass -> Release(); } } pncc -> Release(); }
if (S_OK == hResult) { hResult = pNetConfigurator->Apply(); } ///////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// ///After Install Unlock hResult = pNetConfigurator->Uninitialize();
if ( SUCCEEDED(hResult) ) { INetCfgLock* pncLock;
hResult = pNetConfigurator->QueryInterface(IID_INetCfgLock, (LPVOID *)&pncLock); if (SUCCEEDED(hResult)) { hResult = pncLock->ReleaseWriteLock(); pncLock -> Release(); } }
pNetConfigurator -> Release();
return hResult; }
int _tmain(int argc, _TCHAR* argv[]) { HRESULT hResult = S_OK; hResult = CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED );
if ( !SUCCEEDED(hResult) ) return hResult;
TCHAR tCurrDirPath[MAX_PATH]; WCHAR wCurrDirPath[MAX_PATH]; GetCurrentDirectory( MAX_PATH, tCurrDirPath ); #ifndef _UNICODE MultiByteToWideChar( CP_ACP, 0,tCurrDirPath, MAX_PATH,wCurrDirPath, MAX_PATH); #else MoveMemory( wCurrDirPath, tCurrDirPath , sizeof(WCHAR) * MAX_PATH ); #endif hResult = DoInstallW( wCurrDirPath ); //hResult = DoUnInstallW();
CoInitialize( NULL ); return hResult;
}
P.S.: Кстати политика, поведения при установке неподписанного драйвера храниться в HKLM/SOFTWARE/MICROSOFT/DRIVER SIGNING ключ DWORD:Policy.
|
|
|
Записан
|
while (8==8)
|
|
|
aks68
|
|
« Ответ #11 : 20-08-2006 08:51 » |
|
Добрый день! Не знаю как быть без inf. При появлении нового оборудования система проверяет свою базу данных драйверов (каталог Inf). Если у Вас получиться путем внесения изменений в динамические(!) ключи реестра убедить систему, что минипорт уже у нее был... Ну в общем это слишком круто.
Я, чесно говоря, не доконца понял Вами сказанное. 1. При чем здесь минипорт? Мы вроде про NDIS-IM говорим, а у него минипорт виртуальный и сам device object создается во время загрузки. 2. В локальное хранилище INF Windows лезет только во время установки драйвера имеющего свой INF-файл (для того, чтобы проверить наличие более свежего). 3. Поясните пожалуйста про динамические ключи реестра, в разрезе работы с сетевыми сервисами. В потроха я пока не залазил, но мне почему-то кажется, что установка NDIS-Intermediate, отличается от установки обычного legacy-драйвера всего лишь наличием особых Characteristics и параметров привязки. А поскольку обычный драйвер можно установить без использования INF-файлов, то я рискнул предположить, что и NDIS-Intermediate тоже можно. Основной вопрос – те самые дополнительные ключи реестра – можно попробовать определить во время эталонной установки например драйвера passthru. С уважением, Акс.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #12 : 21-08-2006 00:58 » |
|
NDIS IM абсолютно не legacy драйвер. Невозможно добавить работоспособный драйвер NDIS IM через вызовы SC Manager.
Про минипорт. Драйвер NDIS IM сверху минипорт снизу протокол. При установке драйвера протокола указывается его виртуальный ( а может быть и не виртуальный) минипорт NIC адаптера. Во время установки драйвера протокола, система считает что появилось новое устройство, и начинает поиск драйверов для нового (обновленного) устройства в базе данных Inf.
Как я понимаю ( не обязательно правильно) PNP менеджер при загрузке системы строит совокупность информации об присоединенных устройствах в системе. Эта информация отображается на динамические ключи реестра, такие как HKLM\SYSTEM\CURRENTCONTROLSET\ENUM. Для правильной работы драйвера NDIS IM он должен быть перечислен там, например минипорт с именем NDISSS_MP -> HKLM\SYSTEM\CURRENTCONTROLSET\ENUM\ROOT\NDISSS_MP. Вот именно здесь я вижу сложность проблемы добавления устройства через реестр.
|
|
« Последнее редактирование: 21-08-2006 01:12 от sss »
|
Записан
|
while (8==8)
|
|
|
aks68
|
|
« Ответ #13 : 21-08-2006 07:51 » |
|
NDIS IM абсолютно не legacy драйвер. Невозможно добавить работоспособный драйвер NDIS IM через вызовы SC Manager.
Гм-м-м... Похоже, мы по разному ищем 6-ой вагон - я думаю, что он перед 7-м, а Вы, что он после 5-го... (я про неприсутствие функции AddDevice из WDM, а все, что не WDM - это ,типа, автоматом Legacy )... По-поводу остального - спасибо пошёл обдумывать... Как обдумаю - еще что-нибудь спрошу С уважением, Акс.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #14 : 21-08-2006 07:57 » |
|
Есть вот такой вызов - NdisMRegisterDevice. Подумайте еще и о нем... P.S.: Нельзя вызывать из DriverEntry !
|
|
|
Записан
|
while (8==8)
|
|
|
aks68
|
|
« Ответ #15 : 21-08-2006 08:20 » |
|
Есть вот такой вызов - NdisMRegisterDevice. Подумайте еще и о нем... P.S.: Нельзя вызывать из DriverEntry ! Ну подумал-подумал... и нифига не придумал... (обьясните в чем пойнт, пожалуйста) А вот например обязательный вызов NdisIMInitializeDeviceInstanceEx (вызываемый из обязательного хэндлера BindAdapter), который в общем-то и строит виртуальный адаптер минипортной части NDIS-IM, каждый раз, когда IM биндится, скорее подтверждает мою гипотезу о том, что конфигурация минипорта берется из реестра (а именно из хэндлера реального минипорта, к которому IM уже "прибиндился" своей протокольной частью, спомощю серии OID-запросов извлекаются характеристики и переносятся в только-что созданный виртуальный минипорт) а не из INF... С уважением, Акс.
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #16 : 21-08-2006 08:46 » |
|
Я как-то даже не знаю как ответить... Инициализация происходит после установки (!) устройства. А насчет NdisMRegisterDevice, просто хотел показать, насколько создание объекта устройства в NDIS IM отличается от legacy. Я один раз столкнулся с проблемой отлавливания события SHUTDOWN в минипорте (например для корректного закрытия файлов) ну и оказалось - все совсем не так же...
P.S.: Я не говорю что невозможно. Я думаю что это дико непредсказуемо и нестабильно! Вообще ни с кем не хочу спорить...
|
|
|
Записан
|
while (8==8)
|
|
|
aks68
|
|
« Ответ #17 : 21-08-2006 09:24 » |
|
Я как-то даже не знаю как ответить... Инициализация происходит после установки (!) устройства. А насчет NdisMRegisterDevice, просто хотел показать, насколько создание объекта устройства в NDIS IM отличается от legacy. Я один раз столкнулся с проблемой отлавливания события SHUTDOWN в минипорте (например для корректного закрытия файлов) ну и оказалось - все совсем не так же...
P.S.: Я не говорю что невозможно. Я думаю что это дико непредсказуемо и нестабильно! Вообще ни с кем не хочу спорить...
Ну что Вы, право-слово, сразу надулись ... По моему корректная полемика только расширяет горизонты. А под Вашим постскриптумом (до восклицательного знака включительно ) я готов трижды подписаться Более того, если посмотреть наверх, то можно увидеть, что именно это я и написал (или хотел написать): Другое дело, что я убедительно прошу такими методами ничего не инсталлировать , можно влететь ... У меня например до этого разговора было четкое деление или 100% WDM или, извините, Legacy... Теперь оно пошатнулось. Хотя наверное легася тоже разные бывают. С уважением, Акс.
|
|
« Последнее редактирование: 21-08-2006 09:26 от aks68 »
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #18 : 22-08-2006 00:25 » |
|
Да не дуюсь я, сказал он и лопнул )
|
|
|
Записан
|
while (8==8)
|
|
|
|