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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Динамическая загрузка WDM  (Прочитано 44288 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dvp
Гость
« : 27-06-2003 13:53 » 

Извините что ступил насчет старых-новых форумов.
В общем ситуация такая:
Создается драйвер пустышка в NuMega Driver St . Вопрос как его загрузить динамически. Предложенный метод загрузки через Service Control Manager В ДАННОМ СЛУЧАЕ НЕ РАБОТАЕТ, сервис регистрируется но не стартует (ошибка //  The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
//
#define ERROR_SERVICE_DISABLED           1058L). Но в инете мне попадались исходники, писанные не в NuMege, которые таким образом загружались.
Отсюда вопросы:
- в чем народ обычно пишет драйвера (предпочтения +,-)
- какие еще возможности динамической загрузки есть в W2000 (т.к. через "Установку оборудования" драйвер стартовал нормально)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #1 : 27-06-2003 14:01 » 

void AInstall::InstallDriver(int reinstall)
{

    SC_HANDLE  SchSCManager;
    char       DriverName[255];
    char       ServiceExe[255];
    SC_HANDLE  schService;
    SC_HANDLE  schTcpIpService;
    DWORD      err;
    char       ServiceConfigBuffer[512];
    LPQUERY_SERVICE_CONFIG pTcpIpServiceConfig;
    DWORD      dwBytesNeeded;
    DWORD      dwTagId;

    result = NONE;

    // Create real source name and copy file to system directory
    char SysDir[MAX_PATH];
    char SourceDir[MAX_PATH];
    char DrvName[MAX_PATH];
    if (sInstall.winver == WINDOWS_2000)
    {
        strcpy(DrvName,"\\mnet.sys");
        strcpy(DriverName,"mnet");
        goto Next;
    }
    if (sInstall.winver == WINDOWS_NT)
    {
        strcpy(DrvName,"\\advairNT.sys");
        strcpy(DriverName,"advairNT");
        goto Next;
    }
    if (sInstall.winver == WINDOWS_9X || sInstall.winver == WINDOWS_95)
    {
        strcpy(DrvName,"\\advair.vxd");
        strcpy(DriverName,"advair");
    }
    else
    {

        result = UNKNOWN_WINDOWS_VERSION;
        return;
    }
Next:
   switch (sInstall.winver )
   {
   case WINDOWS_2000:
   case WINDOWS_NT:
      GetSystemDirectory(SysDir,MAX_PATH);
      sprintf(ServiceExe,"%s%s",SysDir,DrvName);
      strcpy(sInstall.DriverLocation,ServiceExe);
      sprintf(SourceDir,"%s%s",sInstall.CurrentDir,DrvName);
      if (!CopyFile(SourceDir,ServiceExe,FALSE))
      {
         int i = 0;
      }
      if (reinstall) return;

      SchSCManager = OpenSCManager (NULL,                 // machine (NULL == local)
                                  NULL,                 // database (NULL == default)
                                  SC_MANAGER_ALL_ACCESS // access required
                                  );
   
      //Gather information about tcpip service:
      schTcpIpService = OpenService(SchSCManager,
                              "tcpip",
                              SERVICE_QUERY_CONFIG);

      if (schTcpIpService==NULL)
      {
         result = TCP_IP_OPEN_ERROR;

         return;
      }

        pTcpIpServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;

        if (!QueryServiceConfig(schTcpIpService,
                         pTcpIpServiceConfig,
                         sizeof(ServiceConfigBuffer),
                         &dwBytesNeeded))
        {
         CloseServiceHandle(schTcpIpService);
         result = QUERY_SERVICE_ERROR;

         return;
        }
      
        schService = CreateService (SchSCManager,          // SCManager database
                             DriverName,            // name of service
                             DriverName,            // name to display
                             SERVICE_ALL_ACCESS,    // desired access
                             SERVICE_KERNEL_DRIVER, // service type
                             pTcpIpServiceConfig->dwStartType,    // start type
                             SERVICE_ERROR_NORMAL,  // error control type
                             ServiceExe,            // service's binary
                             pTcpIpServiceConfig->lpLoadOrderGroup,                  // no load ordering group
                             &dwTagId,              // tag identifier
                             "tcpip",               // dependencies
                             NULL,                  // LocalSystem account
                             NULL                   // no password
                             );

        if (schService == NULL)
        {
         err = GetLastError();

         if (err == ERROR_SERVICE_EXISTS)
         {
           //
           // A common cause of failure (easier to read than an error code)
           //
           UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,FALSE);
           UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE);

           UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,TRUE);
           UpdateDependency(SchSCManager,"Netbt",DriverName,TRUE);

           result = SERVICE_EXISTS_ERROR;
     
         }
         else
         {
             result = SERVICE_CREATE_ERROR;

         }  

         CloseServiceHandle(schTcpIpService);
         return;
        }
        else
        {
         UpdateGroupOrderList(pTcpIpServiceConfig->dwTagId,dwTagId,pTcpIpServiceConfig->lpLoadOrderGroup,TRUE);
         UpdateDependency(SchSCManager,"Netbt",DriverName,TRUE);

        }

        CloseServiceHandle(schTcpIpService);

        CloseServiceHandle (schService);





      
      break;
   case WINDOWS_9X:
   case WINDOWS_95:
      GetWindowsDirectory(SysDir,MAX_PATH);
      sprintf(ServiceExe,"%s%s",SysDir,DrvName);
      strcpy(sInstall.DriverLocation,ServiceExe);
      sprintf(SourceDir,"%s%s",sInstall.CurrentDir,DrvName);
      CopyFile(SourceDir,ServiceExe,FALSE);
      if (reinstall) return;

      if (!WritePrivateString())
      {

      result = CANT_INSTALL_DRIVER_FOR_WIN98;
      }
      

      break;
  default:
    {
      result = UNKNOWN_WINDOWS_VERSION;


      return;
    }
   }
   
   
   
}


BOOL AInstall::UpdateGroupOrderList(
  IN DWORD dwTcpIpTag,
  IN DWORD dwFilterTag,
  IN CHAR *Group,
  IN BOOL  bMode  //TRUE - insert dwFilterTag right after dwTcpIpTag,
                  //FALSE - remove dwFilterTag
)
{
  HKEY  hGroupOrderListKey;
  DWORD dwType=REG_SZ;
  DWORD ValueBuffer[512];
  DWORD dwValueBufferSize=512;
  DWORD i;

  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
                   "SYSTEM\\CurrentControlSet\\Control\\GroupOrderList",
                   0,
                   KEY_QUERY_VALUE | KEY_SET_VALUE,
                   &hGroupOrderListKey) != ERROR_SUCCESS)
  {
    return FALSE;
  }

  dwValueBufferSize = sizeof(ValueBuffer);

  if (RegQueryValueEx(hGroupOrderListKey,
                  Group,
                  NULL,
                  &dwType,
                  (unsigned char *)ValueBuffer,
                  &dwValueBufferSize) != ERROR_SUCCESS)
  {
    RegCloseKey(hGroupOrderListKey);
    return FALSE;
  }

  //
  if (bMode == TRUE)  //Add tag
  {
    for (i=1;i<ValueBuffer[0];i++)
    {
      if (ValueBuffer == dwTcpIpTag)
      {
        memmove(ValueBuffer+i+1,ValueBuffer+i,(ValueBuffer[0]-i+1)*sizeof(DWORD));
        ValueBuffer[i+1] = dwFilterTag;
        ValueBuffer[0]+=1;
        dwValueBufferSize+=sizeof(DWORD);
        break;
      }
    }
  }
  else  //Remove tag
  {
    for (i=1;i<ValueBuffer[0];i++)
    {
      if (ValueBuffer == dwFilterTag)
      {
        memmove(ValueBuffer+i,ValueBuffer+i+1,(ValueBuffer[0]-i)*sizeof(DWORD));
        ValueBuffer[0]-=1;
        dwValueBufferSize-=sizeof(DWORD);
        break;
      }
    }
  }

  if (RegSetValueEx(hGroupOrderListKey,
                Group,
                NULL,
                dwType,
                (unsigned char *)ValueBuffer,
                dwValueBufferSize) != ERROR_SUCCESS)
  {
    RegCloseKey(hGroupOrderListKey);
    return FALSE;
  }


  RegCloseKey(hGroupOrderListKey);
  return TRUE;

}


BOOL AInstall::UpdateDependency(
  IN SC_HANDLE  SchSCManager,  
  IN const CHAR *Service,
  IN const CHAR *Dependant,
  IN BOOL bMode   //TRUE - incert dependency, FALSE - remove it
)
{
  SC_HANDLE  schService;
  char       ServiceConfigBuffer[512];
  char       ServiceDependencies[512];
  PCHAR      pTmp;
  LPQUERY_SERVICE_CONFIG pServiceConfig;
  DWORD      dwBytesNeeded;
  BOOL       bRes;
  int        l, idx;

  //Gather information about netbt service:
  schService = OpenService(SchSCManager,
                           Service,
                           SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG);

  if (schService == NULL)
  {
    return FALSE;
  }


  pServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;

  if (!QueryServiceConfig(schService,
                         pServiceConfig,
                         sizeof(ServiceConfigBuffer),
                         &dwBytesNeeded))
  {
    CloseServiceHandle(schService);
    return FALSE;
  }

  if (bMode)  // insert dependant
  {
    if (pServiceConfig->lpDependencies != NULL)
    {
      pTmp = pServiceConfig->lpDependencies;
      while (*(pTmp) != '\0')
      {
        pTmp+=strlen(pTmp)+1;
      }

      memcpy( ServiceDependencies,
              pServiceConfig->lpDependencies,
              (pTmp-pServiceConfig->lpDependencies));

      pTmp = ServiceDependencies+(pTmp-pServiceConfig->lpDependencies);

    }
    else
    {
      pTmp = ServiceDependencies;
    }

    strcpy(pTmp,Dependant);
    pTmp[strlen(pTmp)+1]='\0';

    pTmp = ServiceDependencies;

  }
  else   // remove dependant
  {
    if (pServiceConfig->lpDependencies != NULL)
    {
      pTmp = pServiceConfig->lpDependencies;
      idx = 0;

      while (*(pTmp) != '\0')
      {
        l = strlen(pTmp);

        if (stricmp(pTmp,Dependant)!=0)
        {
          strcpy(ServiceDependencies+idx,pTmp);
          idx+=l+1;
          ServiceDependencies[idx]=0;
        }

        pTmp+=l+1;
      }

      ServiceDependencies[idx]=0;
      ServiceDependencies[idx+1]=0;

      pTmp = ServiceDependencies;

    }
    else
    {
      pTmp = NULL;
    }

  }


  bRes = ChangeServiceConfig( schService,
                              SERVICE_NO_CHANGE,
                              SERVICE_NO_CHANGE,
                              SERVICE_NO_CHANGE,
                              NULL,
                              NULL,
                              NULL,              // tag identifier
                              pTmp,
                              NULL,
                              NULL,
                              NULL);

  CloseServiceHandle(schService);

  return bRes;

}

void AInstall::RemoveDriver()
{
  SC_HANDLE  SchSCManager;
  char       DriverName[255];
  SC_HANDLE  schService;
  char       ServiceConfigBuffer[512];
  LPQUERY_SERVICE_CONFIG pServiceConfig;
  DWORD      dwBytesNeeded;
  BOOL       ret;
  BOOL       bUpdateTag;

  result = NONE;


  switch (sInstall.winver)
  {
  case WINDOWS_2000:
  case WINDOWS_NT:


     bUpdateTag = FALSE;


if (sInstall.winver == WINDOWS_2000)
    {
       
        strcpy(DriverName,"mnet");
        goto Next;
    }
    if (sInstall.winver == WINDOWS_NT)
    {
       
        strcpy(DriverName,"advairNT");
        goto Next;
    }
    if (sInstall.winver == WINDOWS_9X || sInstall.winver == WINDOWS_95)
    {
       
        strcpy(DriverName,"advair");
    }
    else
    {
        result = UNKNOWN_WINDOWS_VERSION;

        return;
    }
Next:
     SchSCManager = OpenSCManager (NULL,                 // machine (NULL == local)
                             NULL,                 // database (NULL == default)
                             SC_MANAGER_ALL_ACCESS // access required
                             );
   
     schService = OpenService (SchSCManager,
                        DriverName,
                        SERVICE_ALL_ACCESS
                        );

     if (schService == NULL)
     {
       result = UNKNOWN_WINDOWS_VERSION;

        UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE);
      return;
     }

     pServiceConfig = (LPQUERY_SERVICE_CONFIG )&ServiceConfigBuffer;

     if (QueryServiceConfig(schService,
                      pServiceConfig,
                      sizeof(ServiceConfigBuffer),
                      &dwBytesNeeded))
     {
      bUpdateTag = TRUE;
     }


     ret = DeleteService (schService);

     if (ret)
     {
    //   printf ("DeleteService SUCCESS\n");
     }
     else
     {
      result = CANT_REMOVE_DRIVER;

     }

 
     if (bUpdateTag)
     {
      UpdateGroupOrderList(0,pServiceConfig->dwTagId,pServiceConfig->lpLoadOrderGroup,FALSE);
     }

     UpdateDependency(SchSCManager,"Netbt",DriverName,FALSE);

     CloseServiceHandle (schService);
     break;
  case WINDOWS_9X:
  case WINDOWS_95:   
     DeletePrivateString();
     break;
  }

}

Вот так я устанвливал свой фильтр - обычной программой - старт драйвера у меня требовал перезагрузки...
Драйвер фильтр - TDI драйвер который встраивается в NDIS...

Возможно по этому коду ты сможешь разобраться в том, как работать с товим WDM.

1. Пишу в DDK
2. Не думал над таким вопросом вплотную...думаю Славик подскажет лучше.
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #2 : 27-06-2003 14:12 » 

Вот еще ф-ции- NtLoadDriver & NtUnloadDriver(Они же ZwLoadDriver & ZwUnloadDriver)- эспортируются из NTDLL.dll. Попробуй их, но они тоже могут не помочь, так как вызываются из SCM, а им ты уже пробовал. Других спосов кроме двух, которые ты уже знаешь по-моему нет.

Скорее всего твой драйвер- далеко не пустышка и требует наличия девайса, отсюда и проблемы. Посмотри внимательно что ты просишь создать у Numega - она по моему драйвера для реальных устройств создает.
Писать драйвер надо на C, если решишь писать на C++ тебе понадобится RunTime библиотека в ядре для инициализации глобальных объектов(вызовы конструкторов классов до вызова DriverEntry), runtime библиотеки C++ в ядре нет, есть примеры создания таких библиотек для ядра. как там выкручивается NuMega не знаю.
Писать на асме не стоит, во первых теперь винда как минимум для трех платформ- IA-32, IA-64, AMD 64, и во вторых- 64 разрядные компиляторы не поддерживают встроенный ассемблер(к тому же он разный у каждой архитектуры).


Вот прототипы и описание NtLoadDriver & NtUnloadDriver(Они же ZwLoadDriver & ZwUnloadDriver)

1) ZwLoadDriver loads a device driver.
NTSYSAPI
NTSTATUS
NTAPI
ZwLoadDriver(
IN PUNICODE_STRING DriverServiceName
);
Parameters
DriverServiceName
Specifies the registry key name where the driver configuration information is stored.
Return Value
Returns STATUS_SUCCESS or an error status, such as STATUS_PRIVILEGE_NOT_HELD,
STATUS_CONFLICTING_ADDRESSES, STATUS_INVALID_IMAGE_FORMAT,
STATUS_PROCEDURE_NOT_FOUND, STATUS_IMAGE_ALREADY_LOADED,
STATUS_IMAGE_CHECKSUM_MISMATCH, STATUS_IMAGE_MP_UP_MISMATCH,
STATUS_DRIVER_ORDINAL_NOT_FOUND, STATUS_DRIVER_ENTRYPOINT_NOT_FOUND,
STATUS_DRIVER_UNABLE_TO_LOAD, or STATUS_ILL_FORMED_SERVICE_ENTRY.

Related Win32 Functions
None.
Remarks
SeLoadDriverPrivilege is required to load a driver.
The Win32 function StartService directs the Service Control Manager process to
execute this function on behalf of the caller.
The Service Control Manager process provides a DriverServiceName of the form
“\Registry\Machine\System\CurrentControlSet\Services\Tcpip.”



2)ZwUnloadDriver
ZwUnloadDriver unloads a device driver.
NTSYSAPI
NTSTATUS
NTAPI
ZwUnloadDriver(
IN PUNICODE_STRING DriverServiceName
);
Parameters
DriverServiceName
Specifies the registry key name where the driver configuration information is stored.
Return Value
Returns STATUS_SUCCESS or an error status, such as STATUS_PRIVILEGE_NOT_HELD,
STATUS_ILL_FORMED_SERVICE_ENTRY, or STATUS_OBJECT_NAME_NOT_FOUND.
Related Win32 Functions
None.
Remarks
SeLoadDriverPrivilege is required to unload a driver.
The Win32 function ControlService directs the Service Control Manager process to
execute this function on behalf of the caller.
The Service Control Manager process provides a DriverServiceName of the form
“\Registry\Machine\System\CurrentControlSet\Services\Tcpip.”
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #3 : 27-06-2003 14:15 » 

А я делаю так:


///**************Функции динамической загрузки************************
bool drvLoad(char* name)
{
   printf (name);
   hSCManager=NULL;
   hService=NULL;
   bool status;
   status=FALSE;
   
    if(OpenManager())
   {
         if(drvCreateService(name))
         {
            if(drvStartService(name))
             {
                               status=TRUE;
                                printf("\n Driver is now load...\n");
                           }
                       }
                  }

              hDevice = CreateFile ("//./LptStack", GENERIC_READ,
                              FILE_SHARE_READ | FILE_SHARE_WRITE,
                              NULL, OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL, NULL);// в драйвере у меня \\Device\\LptStack  и    \\DosDevices\\LptStack  и сам драйвер называется LptStack.sys

   return status;
}

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

bool OpenManager()
{
   bool status;
   status=FALSE;
   
   if(hSCManager!=NULL)
   {
        CloseServiceHandle (hSCManager);
      printf("CloseServiceHandle was used \n");
      hSCManager=NULL;
   }
   
   hSCManager=OpenSCManager (NULL,NULL,SC_MANAGER_ALL_ACCESS);
   if (hSCManager == NULL)
   {
      error(_OpenSCManager);
   } else status=TRUE;

   return status;
}

//---------------------------------------------------------------------
bool drvCreateService(PCHAR pDrvName)
{
   LPTSTR lpBuffer;
  lpBuffer = new char[256];
  BOOL status = FALSE;
  LPTSTR awPath; // путь к драйверу с именем pDrvName

 
   GetCurrentDirectory(256, lpBuffer);
   strcat(lpBuffer,"\\");
   strcat(lpBuffer,pDrvName);
   awPath = lpBuffer;


hService = CreateService(hSCManager,pDrvName,pDrvName,SERVICE_ALL_ACCESS,
           SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,
            awPath,NULL,NULL,NULL,NULL,NULL);


        if(!hService)
        {
         error(_CreateService);
        drvOpenService(pDrvName);
        }
        else status=TRUE;

  delete lpBuffer;
   


   return status;
}

//--------------------------------------------------------------------
bool drvOpenService(PCHAR name)
{      

   bool status;
   status=FALSE;
   
   if(hService!=NULL) CloseService();

   hService=OpenService(hSCManager,name,SERVICE_ALL_ACCESS);
   if (!hService) error(_OpenService);
   else status=TRUE;
 
   return status;
}

//---------------------------------------------------------------------
bool drvStartService(PCHAR name)
{
//   printf ("drvStartService");
   bool status;
   status=FALSE;
    if(!StartService(hService,0,NULL))
   {
      error(_StartService);
       printf("Deleting service...");
   }
   else status=TRUE;

   return status;
}
 
//---------------------------------------------------------------------
bool drvDeleteService(PCHAR name)
{
   bool status;
   status=FALSE;
   CloseService();
   if(!DeleteService(hService)) error(_DeleteService);
    else status=TRUE;

   return status;
}

//-------------------------------------------------------------------
void CloseService()
{
   CloseServiceHandle (hService);
   hService=NULL;
}

//-------------------------------------------------------------------
int drvUnLoad(PCHAR name)
{
   int status;
   status=FALSE;

   if (hDevice!=INVALID_HANDLE_VALUE)
   {
      if(!CloseHandle(hDevice)) error(_CloseHandle);
     hDevice=INVALID_HANDLE_VALUE;
   }
   
   if (hService)
    {
    status = ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus);
      if(!status)  error(_SERVICE_CONTROL_STOP);
   
   status = DeleteService(hService);
      if(!status) error(_DeleteService);
     
    status = CloseServiceHandle(hService);
      if(!status) error(_CloseServiceHandle);
    }

  if(!CloseServiceHandle(hSCManager)) error(_CloseServiceHandle);
  if (status) printf("Driver Unload... SUCCESS\n");
  return status;
}

Для загрузки вызываешь drvLoad, причем файл драйвера должен лежать рядом с exe-приложением.
Записан
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #4 : 27-06-2003 14:50 » 

Цитата: dvp
Предложенный метод загрузки через Service Control Manager В ДАННОМ СЛУЧАЕ НЕ РАБОТАЕТ, сервис регистрируется но не стартует (ошибка //  The service cannot be started, either because it is disabled or because it has no enabled devices associated with it.
//
#define ERROR_SERVICE_DISABLED           1058LОтсюда вопросы:
- в чем народ обычно пишет драйвера (предпочтения +,-)
- какие еще возможности динамической загрузки есть в W2000 (т.к. через "Установку оборудования" драйвер стартовал нормально)


Обрати внимание на то, как соотносятся имена которые ты передаешь СreateService(), CreateFile c именами которые написаны в драйвере
 (что-то вроде  \\Device\\Имя  и \\DosDevices\\Имя ).
Удачный "старт сервиса " зависет от корректности параметров переданных СreateService().

Еще, если у тебя сервис создан, а ты его снова попытаешься создать--то получишь ошибку, в этом случуе следует использовать OpenService().


P.S.  Драйвера пишу на С, без Numegи. На основе примеров в ДДК.
Записан
dvp
Гость
« Ответ #5 : 27-06-2003 14:53 » 

Да нет OpenService возвращает нормальный указатель на сервис, просто он не стартуется. сейчас пытаюсь запустить с помощью ZwLoadDriver
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #6 : 27-06-2003 15:06 » 

А он и не должен стартовать.
OpenService и все остальное - это регистрация драйвера в системе, для старта ты должен стартовать его сам.
Или перезагрузить систему, тогда она стартует его сама....
Записан

А птичку нашу прошу не обижать!!!
Артем
Опытный

nz
Offline Offline
Пол: Мужской
Beware the wolf in sheep's clothing.


« Ответ #7 : 27-06-2003 15:08 » 

Цитата: Гром
А он и не должен стартовать.
OpenService и все остальное - это регистрация драйвера в системе, для старта ты должен стартовать его сам.
Или перезагрузить систему, тогда она стартует его сама....


2dvp Разве ты не используешь функцию StartService???
Записан
dvp
Гость
« Ответ #8 : 27-06-2003 16:41 » 

да subj какой, мне перезагрузка не нужна.
а то что OpenService драйвер не стартует, это понятно, я просто объясняю что драйвер зарегистрировался и открывается openservice, но Startservice не запускает его.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 27-06-2003 16:46 » 

Так для этого уже говоили тут что делать - на старом форуме, Слав ты не помнищь??? В драйвере должна быть процедура старта, и потом по моему не каждыйдрайвер можно стартовать так...
Записан

А птичку нашу прошу не обижать!!!
dvp
Гость
« Ответ #10 : 27-06-2003 16:48 » 

Поподробнее пожайлуста ......
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #11 : 27-06-2003 17:16 » 

Цитата: Гром
Так для этого уже говоили тут что делать - на старом форуме, Слав ты не помнищь??? В драйвере должна быть процедура старта, и потом по моему не каждыйдрайвер можно стартовать так...


В драйвере есть только DriverEntry- точка входа, устанавлимая линковщиком, более ничего. Вызывается только она.

Все остальное относится к WDM драйверам при наличии реальных девайсов для этого драйвера. Это было на старом форуме, но повторю-

В нижеследующем тексте под словом "шина" подразумевается любое устройство, к которому могут быть присоеденены другие устройства- например под это определение попадают шина PCI, USB, IEEE 1394 также под это определение попадают "виртуальные" шины(как пример- toaster в DDK, но обратите внимание- он не соответствует никакому реальному устройству, поэтому количество PDO ему сообщают из приложения, он их и создает).

Последовательность загрузки всех драйверов(начиная с Win2k) такая:
1) Загружают драйвер системной шины. Например PCI.
2) Вызывают DriverEntry а затем AddDevice для драйвера системной шины. В AddDevice создается FDO для драйвера системной шины. Потом посылают IRP_MN_START_DEVICE на созданный FDO.
3) Драйвер шины нумерует устройства на шине. Создает для них PDO-эти PDO управляются драйвером шины на которой они сидят.
4) Драйверу системной шины посылают IRP_MN_QUERY_DEVICE_RELATIONS, в ответ на который он возвращает массив созданных им PDO для устройств на шине.
5) На эти PDO посылают запрос IRP_MN_QUERY_ID, в ответ на которые драйвер системной шины сообщает ID этих устройств.
6) Получив эти ID система пытается найти и загрузить драйвера устройств. Если устройство само является шиной, то для него повторяется вся последовательность действий.
7) Найдя драйвер для устройства, система отображает его в память вызывает его DriverEntry(если он еще не загружен), потом AddDevice, в этом AddDevice создается FDO для устройства. Если устройств управляемых этим драйвером несколько то AddDevice будет вызвана для каждого устройства. Также смотрят реестр на предмет наличия фильтров для девайса.
8 Потом засылает на созданные FDO запрос IRP_MN_START_DEVICE.

Если железяки в компе нет и эта железяка не найдена драйвером шины то драйвер не грузится. Если это какая-то кривая железяка, для которой драйвер грузится без драйвера шины( просто прописано грузить драйвер и все) то драйвер загрузится независимо от наличия или отсутствия- как он там будет разбираться с системой его личное дело. Например так поступают драйвера на NT4, но там и не WDM драйверы.
Записан
dvp
Гость
« Ответ #12 : 27-06-2003 17:25 » 

ну а если у меня не железячный драйвер, а для того чтобы просто получить доступ к ring)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #13 : 27-06-2003 17:31 » 

Цитата: dvp
ну а если у меня не железячный драйвер, а для того чтобы просто получить доступ к ring)


DriverEntry и все- в нем создаешь нужные DEVICE_OBJECT и т.д. Ничего кроме DriverEntry при старте вызываться не будет. Возвращать STATUS_SUCCESS.
Записан
dvp
Гость
« Ответ #14 : 27-06-2003 19:11 » 

но динамически он загружаться будет? Никакого кода добавлять не надо?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #15 : 27-06-2003 19:17 » 

Цитата: dvp
но динамически он загружаться будет? Никакого кода добавлять не надо?


Конечно будет. Не надо никакого кода.
Записан
dvp
Гость
« Ответ #16 : 27-06-2003 19:31 » 

Ну ладно. Чтоб в общем закрыть тему. то есть забиваем на NuMega, работаем чисто в DDK.(Если народ еще поможет с переменными окружения ....).
Просто возникла идея написать прогу, отслеживающую запуск и выключение процессов.
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #17 : 27-06-2003 20:17 » 

Цитата: dvp
Ну ладно. Чтоб в общем закрыть тему. то есть забиваем на NuMega, работаем чисто в DDK.(Если народ еще поможет с переменными окружения ....).
Просто возникла идея написать прогу, отслеживающую запуск и выключение процессов.


Ну это элементарно- регестрируйся на PsSetCreateProcessNotifyRoutine и вперед.
А вобще то это сделано.
Вот тебе ссылочка на код - http://codeguru.earthweb.com/system/apihook.html
Там статья и код(Downloads внизу статьи), все уже сделано, надо только разобраться.
Кстати- драйвер из этой статьи моими ф-циями загружается, проверял. Вобще-то и другие драйвера всегда грузились.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #18 : 27-06-2003 22:59 » 

Переменные окружения создаются в DDK почредством запуска .bat файла из Стартового меню винды.

Посмотреть их всех можно запутив в окне комманду SET
По компиляции см. статью на сайте по драйверам - пдробно описано.

Что еще?
Записан

А птичку нашу прошу не обижать!!!
V.L.
Гость
« Ответ #19 : 30-06-2003 10:41 » 

Очень интересная тема. Многого не знаю, так что поправте... WDM драйвер не должен динамически грузиться-выгружаться по желанию или должны быть какие-то ограничения т.к. он PnP. Т.е. сильно зависит от наличия или отсуствия родного железа - ОС его хочет а мы его не пускаем и наоборот. В не PnP драйвере таких связей нет и нет проблем его грузить-выгружать динамически (давно проверялось на non PnP ISA device driver от NuMega - мин нет!). Ведь в NuMega  визард в начале спрашивает - PnP будет драйвер или нет и в зависимости от этого различные объекты в текст подсовывает.
Записан
dvp
Гость
« Ответ #20 : 30-06-2003 12:05 » 

Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)...
Значит в операционке где то это все храниться? Куда копать?
Записан
V.L.
Гость
« Ответ #21 : 30-06-2003 13:03 » 

Много полезной информации и утилит находится на www.osr.com & www.osronline.com . На http://www.osronline.com/article.cfm?id=157 находится программа Driver Loader которая динамически загружает - выгружает драйвера. Готовая программа для экспериментов.
Записан
dvp
Гость
« Ответ #22 : 30-06-2003 13:43 » 

Цитата: V.L.
Много полезной информации и утилит находится на www.osr.com & www.osronline.com . На http://www.osronline.com/article.cfm?id=157 находится программа Driver Loader которая динамически загружает - выгружает драйвера. Готовая программа для экспериментов.
да уж пришлось самому такую прогу налабать. Но NuMegoвские драйвера она тоже не грузит (механизм же тот же).

при запуске build выдает
NMAKE.EXE failed - rc = 1 как с этой фигней бороться (батник  checked build enviromeny запустил)
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #23 : 30-06-2003 14:24 » 

Цитата: dvp
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)...
Значит в операционке где то это все храниться? Куда копать?


По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил.
Записан
dvp
Гость
« Ответ #24 : 30-06-2003 14:33 » 

Цитата: SlavaI
Цитата: dvp
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)...
Значит в операционке где то это все храниться? Куда копать?


По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил.
не знаю как насчет потоков, но она при первом запуске показала кучу процессов, запущенных и выключенных с момента включения компьютера, то есть до того как она вообще появилась на винте.
Записан
dvp
Гость
« Ответ #25 : 30-06-2003 14:40 » 

http://www.itsophy.com/kpviewer/kpviewer.html
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #26 : 30-06-2003 16:00 » 

Цитата: dvp
Цитата: SlavaI
Цитата: dvp
Немного не в тему, но видел такую софтину под 2000, к-я выводит список всех процессов, когда либо запущенных в этой сессии (время запуска, завершения)...
Значит в операционке где то это все храниться? Куда копать?


По моему винда не хранит истории потоков в процессе. Та софтина скорее всего сама запоминала кто чего запустил.
не знаю как насчет потоков, но она при первом запуске показала кучу процессов, запущенных и выключенных с момента включения компьютера, то есть до того как она вообще появилась на винте.


"Информация о закрытых процессах сохраняется системой до того момента, пока есть открытые описатели процесса, созданные с целью синхронизации, определения статуса завершения и т.д. "- вот как она их показывает, это означает что она покажет те, на которые остались ссылки, если ссылок нет, то и не будет структуры для этого процесса. Я не раз видел людей которые пытались что-то делать не удостоверившись что структура потока(процесса) еще жива в памяти. Я и сам сталкивался с тем что мне пришлось писать драйвер, который держал в памяти структуры завершаемых потоков, так как как я потом к ним обращался, до того как я это сделал- я получал иногда BSOD, так как я сначала получал указатель на поток, а спустя некоторое время обрабатывал структуру, на которую он указывал- вот тут я ошибся, так как поток мог быть уничтожен к моменту повторного обращения, тогда я и сделал драйвер, который держал в памяти потоки.
 А основная причина удержания структур и потоков в памяти- незавершенные IRP, максимальное время удержания структуры потока в памяти- 5 минут, если после этого все IRP не завершатся произойдет принудительное обнуление большей части структуры потока и освобождение памяти. Поведение системы при этом непредсказуемо, IRP могут завершится ничего не задев , а могут BSOD отвесить.
А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах.

А если тебе интересно- то указатели на потоки и процессы хранятся в виде связанного списка и можно пройтись по списку и узнать все что надо.
Записан
dvp
Гость
« Ответ #27 : 30-06-2003 16:09 » 

> А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах.

А как получить эту инфу?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #28 : 30-06-2003 16:12 » 

Цитата: dvp
> А винда не держит информацию о предыдущих потоках, то есть то что показывает программа- это инфа о случайным образом оставшихся в памяти структурах.

А как получить эту инфу?


Каую инфу? О закончившихся процесса? Никак. Или пройтись по списку процессов - там будут как живые так и закончившиеся, но не все закончившиеся, а только те которые намеренно держут.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #29 : 30-06-2003 16:14 » 

В процессах которые еще недобиты, ты сможешь получить только код возврата и все, УВЫ... Рихтер пишет именно так, и я тоже  Отлично
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines