Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Регистрация NDIS драйвера  (Прочитано 22209 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« : 12-06-2006 10:27 » 

Друзья, подскажите пожалуйста, как можно установить в систему NDIS IM драйвер
(например, тот же passthru.sys из DDK) программно?
Как поставить вручную — ясно, но как установить его из своей программы
не понятно вообще! Это ж надо, как минимум, каким-то образом обработать инф-файлы...

Кроме того, насколько я понимаю, NDIS IM и NDIS Filter драйверы - вещи разные. Вторые (NDIS Filter) ставятся без помощи конечного ползователя и биндятся сами. Это так?  Если да, то где можно почитать про них? В чем заключается разница между этими типами драйверов? И можно ли как-то легким движением руки переделать passthru в НДИС фильтер-драйвер?
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #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
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 12-06-2006 12:23 » 

Большое спасибо за исчерпывающий ответ!

Насчет bindview мне уже говорили, только вот ДДК скачать у меня никакой возможности сейчас нет, а отдельно этот пример я найти не смог Жаль    Жаль. Придется, наверное, ждать возможности выкачать такой обьем.
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #3 : 12-06-2006 13:30 » 

Большое спасибо за исчерпывающий ответ!

Насчет bindview мне уже говорили, только вот ДДК скачать у меня никакой возможности сейчас нет, а отдельно этот пример я найти не смог Жаль    Жаль. Придется, наверное, ждать возможности выкачать такой обьем.

Могу переслать/залить сам пример и главу из документации DDK посвященную NDIS. Есть куда?

Акс.

PS: Пример ~30Kb, документ (chm-file) ~3Mb
« Последнее редактирование: 12-06-2006 13:32 от aks68 » Записан
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 12-06-2006 14:05 » 

О! Это было бы просто замечательно!  С ума сойти...

Igor_master<собачка>ukr.net

Если вы мне вышлете этот пример, то я буду просто безмерно благодарен!

Хотя бы исходник...
« Последнее редактирование: 12-06-2006 14:07 от HempStar » Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #5 : 13-06-2006 11:20 » 

О! Это было бы просто замечательно!  С ума сойти...

Igor_master<собачка>ukr.net

Если вы мне вышлете этот пример, то я буду просто безмерно благодарен!

Хотя бы исходник...

Ну как, получили? Если да, то могу выслать еще одну главу из MS DDK Documentation...

Акс.
Записан
BlackStar
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Постоялец

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 25-07-2006 12:35 » 

Я сам интересовался этой темой, но, похоже, что так сделать нельзя. Если вдруг появится решение этой проблемы, то убедительно прошу опубликовать его здесь.  Улыбаюсь
Записан

Программирование на заказ   C/C++, Delphi, PHP, javascript
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #9 : 14-08-2006 16:57 » 

Я сам интересовался этой темой, но, похоже, что так сделать нельзя. Если вдруг появится решение этой проблемы, то убедительно прошу опубликовать его здесь.  Улыбаюсь

Я пологаю, что это сделать можно. Скорее всего дело ограничивается добавлением ключей реестра и переносом драйвера в каталог %windir%\system32\drivers
Для старых систем <= win2000 еще надо добавить notification object.

Так что берите драйвер (с inf файлом разумеется), берите RegMon от sysinternals и вперед!

Другое дело, что я убедительно прошу такими методами ничего не инсталлировать  Ага, можно влететь  :Улыбаюсь...

С уважением Акс.
Записан
sss
Специалист

ru
Offline 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
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #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
Специалист

ru
Offline 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
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #13 : 21-08-2006 07:51 » 

NDIS IM абсолютно не legacy драйвер. Невозможно добавить работоспособный драйвер NDIS IM через вызовы SC Manager.

Гм-м-м...

Похоже, мы по разному ищем 6-ой вагон - я думаю, что он перед 7-м, а Вы, что он после 5-го...  Ага (я про  неприсутствие функции AddDevice из WDM, а все, что не WDM - это ,типа, автоматом Legacy Отлично Отлично Отлично)...

По-поводу остального - спасибо пошёл обдумывать... Как обдумаю - еще что-нибудь спрошу  Улыбаюсь

С уважением,

Акс.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #14 : 21-08-2006 07:57 » 

Есть вот такой вызов - NdisMRegisterDevice. Подумайте еще и о нем...  Ага

P.S.: Нельзя вызывать из DriverEntry !
Записан

while (8==8)
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #15 : 21-08-2006 08:20 » 

Есть вот такой вызов - NdisMRegisterDevice. Подумайте еще и о нем...  Ага

P.S.: Нельзя вызывать из DriverEntry !

Ну подумал-подумал...  Здесь была моя ладья... и нифига не придумал... Не понял  (обьясните в чем пойнт, пожалуйста) Улыбаюсь

А вот например обязательный вызов NdisIMInitializeDeviceInstanceEx (вызываемый из обязательного хэндлера BindAdapter), который в общем-то и строит виртуальный адаптер минипортной части NDIS-IM, каждый раз, когда IM биндится, скорее подтверждает мою гипотезу о том, что конфигурация минипорта берется из реестра (а именно из хэндлера реального минипорта, к которому IM уже "прибиндился" своей протокольной частью, спомощю серии OID-запросов извлекаются характеристики и переносятся в только-что созданный виртуальный минипорт) а не из INF...

С уважением,
Акс.
Записан
sss
Специалист

ru
Offline Offline

« Ответ #16 : 21-08-2006 08:46 » 

Я как-то даже не знаю как ответить... Инициализация происходит после установки (!) устройства. А насчет NdisMRegisterDevice, просто хотел показать, насколько создание объекта устройства в NDIS IM отличается от legacy. Я один раз столкнулся с проблемой отлавливания события SHUTDOWN в минипорте (например для корректного закрытия файлов) ну и оказалось - все совсем не так же...

P.S.: Я не говорю что невозможно. Я думаю что это дико непредсказуемо и нестабильно! Вообще ни с кем не хочу спорить...
Записан

while (8==8)
aks68
Модератор

il
Offline Offline
Пол: Мужской

« Ответ #17 : 21-08-2006 09:24 » 

Я как-то даже не знаю как ответить... Инициализация происходит после установки (!) устройства. А насчет NdisMRegisterDevice, просто хотел показать, насколько создание объекта устройства в NDIS IM отличается от legacy. Я один раз столкнулся с проблемой отлавливания события SHUTDOWN в минипорте (например для корректного закрытия файлов) ну и оказалось - все совсем не так же...

P.S.: Я не говорю что невозможно. Я думаю что это дико непредсказуемо и нестабильно! Вообще ни с кем не хочу спорить...

Ну что Вы, право-слово, сразу надулись  Жаль ...
По моему корректная полемика только расширяет горизонты.
А под Вашим постскриптумом (до восклицательного знака включительно Ага) я готов трижды подписаться  Пиво!
Более того, если посмотреть наверх, то можно увидеть, что именно это я и написал (или хотел написать):

Цитата: aks68
Другое дело, что я убедительно прошу такими методами ничего не инсталлировать  , можно влететь  ...


У меня например до этого разговора было четкое деление или 100% WDM или, извините, Legacy... Теперь оно пошатнулось. Хотя наверное легася тоже разные бывают.

С уважением,
Акс.


« Последнее редактирование: 21-08-2006 09:26 от aks68 » Записан
sss
Специалист

ru
Offline Offline

« Ответ #18 : 22-08-2006 00:25 » 

Да не дуюсь я, сказал он и лопнул  Улыбаюсь)
Записан

while (8==8)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines