Подземелье Кода

4-ое января 2007

Вызовите развертку от Делфи, InstallShield обнаружения оборудования, C++, сценарий или побегите подсказка

Сохранено вниз: Серия, Делфи, RegEdit, WINDOWS, XP, установка - 2:04 pm Брайан @

В моем процессе раскрытия, он посмотрел как я шел обнаружить некоторые изменения в оборудовании и после этого выполнить reboot.
Я исследовал как сделать это но он поворачивает ou что мне не нужен этот Код. В подземелье он идет.

Вы можете конечно побежать «добавляете чудодей новое оборудование» вручную. Здесь линия передачи команд для того чтобы сделать как раз то:
«C:\WINDOWS\system32\rundll32.exe» C:\WINDOWS\system32\shell32.dll, Control_RunDLL «C:\WINDOWS\system32\hdwwiz.cpl», обнаруживает оборудование

Однако, что если вы хотите автоматизировать процесс.

Информация для как сделать это относительно вряд даже если страница technet о ей. Странно достаточно первая вещь я нашел был сценарием NSIS для делать это через ту программу instalation открытого источника. Странная вещь о ей что она находилась на вебсайте WinAMP (соединении).

Здесь тот Код:

КОД:
  1. Функция ScanForNewHW
  2. Alwaysoff SetPluginUnload
  3. StrCpy $1 «»
  4.  
  5. Система:: Setupapi звонока ':: ′ CM_Locate_DevNodeA (*i .r0, t r1, I r2) I .r3
  6. Система:: Setupapi звонока ':: ′ CM_Reenumerate_DevNode (r0 I, I r4) I .r5
  7.  
  8. Руководство SetPluginUnload
  9. Система:: Освободите 0
  10. FunctionEnd

Подготовлено с именем DLL, вторая вещь я нашел был сценарием экрана устанавливать (соединением) который позволил ей быть сделанным:

КОД:
  1. функция ScanForHardwareChanges ()
  2.   devInst НОМЕРА, myreturn;
  3. начните
  4.   если (UseDLL, то (^ «cfgmgr32.dll WINSYSDIR ")! = 0) после этого
  5.     MessageBox («не нагрузил Dll», СТРОГИЙ);
  6.     возвращенное ЛОЖНОЕ;
  7.   endif;
  8.   myreturn = CM_Locate_DevNodeA (&devInst, «\ 0 «, 0);
  9.   myreturn = CM_Reenumerate_DevNode (devInst, 0);
  10.   UnUseDLL (^ «cfgmgr32.dll WINSYSDIR ");
  11.   возвращенно TRUE;
  12. конец;

Подготовлено с именем DLL и возможным именем процедуры, я мог отслеживать вниз страницу поддержки Майкрософт о ей (соединение). Та страница обеспечила режим A.C. для вызывать Код. Здесь она является следующим:

C:
  1. BOOL ScanForHardwareChanges ()
  2. {
  3.     DEVINST     devInst;
  4.     CONFIGRET   состояние;
  5.    
  6.     //
  7.     // получает devnode корня.
  8.     //
  9.    
  10.     состояние = CM_Locate_DevNode (&devInst, NULL, CM_LOCATE_DEVNODE_NORMAL);
  11.    
  12.     если (состояние! = CR_SUCCESS) {
  13.         printf («CM_Locate_DevNode потерпело неудачу: %x \ n «, состояние);
  14.         возвращенное ЛОЖНОЕ;
  15.  
  16.     }
  17.    
  18.     состояние = CM_Reenumerate_DevNode (devInst, 0);
  19.    
  20.     если (состояние! = CR_SUCCESS) {
  21.         printf («CM_Reenumerate_DevNode потерпело неудачу: %x \ n «, состояние));
  22.         возвращенное ЛОЖНОЕ;
  23.     }
  24.  
  25.     возвращенно TRUE;
  26. }

Однако, я хотел сделать это в Делфи. С правильно постоянн именами, я мог найти 2 справки к этому режиму. Проект Делфи JEDI имеет a обеспечивает режим для нагружать DLL который позволяет эти быть позвоненным и или кто-то (соединение) Код переведенного Майкрософта в режим для просматривать для оборудования или было теперь пойденное a, проект демонстрации JEDI который включил этот режим. Любой путь, французское место был первое одним я счесл то просмотрено для нового оборудования с Делфи.

Здесь тот Код:

ДЕЛФИ:
  1. процедура SomeProcedure;
  2.   // сперва вы потребность нагрузить модуль. 
  3.   LoadConfigManagerApi; 
  4.   // после этого вызывает перевод режима MS
  5.   ScanForHardwareChanges;
  6. конец;
  7.  
  8. // здесь перевод ScanForHardwareChanges
  9. функция ScanForHardwareChanges: булевско;
  10. var
  11.   dev: DEVINST;
  12.   состояние: CONFIGRET;
  13. начните
  14.  
  15.   состояние: = CM_Locate_DevNode (dev,», CM_LOCATE_DEVNODE_NORMAL);
  16.  
  17.   если (<> CR_SUCCESS состояния) после этого
  18.   начните
  19.     результат: = ЛОЖНО;
  20.     выход;
  21.   конец;
  22.  
  23.   состояние: = CM_Reenumerate_DevNode (dev, 0);
  24.  
  25.   если (<> CR_SUCCESS состояния) после этого
  26.   начните
  27.     результат: = ЛОЖНО;
  28.     выход;
  29.   конец;
  30.   Результат: = TRUE;
  31. конец;

Что режим был выбран вверх на русском месте (соединении) и был доработан для того чтобы быть независимым архивов JEDI. Однако, оба из этих режимов включают путь больше информации чем необходим.

Процесс действительно просто.
1. Нагрузите DLL
2. Получите расположение 2 методов вам.
3. Вызовите их (используя соотвествующие константы
4. Расгрузите все.

Я писал мой собственный режим Делфи который делает вс то и не имеет никакой экстренный волочат багаж, котор (снадобье?) вдоль для езды.

Мое неразъемное разрешение:

ДЕЛФИ:
  1. {******************************************************************************
  2.   ScanForHardwareChanges
  3.   Брайан Неспециалистом на TheCodeCave.com
  4. ******************************************************************************}
  5. функция ScanForHardwareChanges: Булевско;
  6. const
  7.   CFGMGR32_DLL                 = `cfgmgr32.dll';
  8.   CM_LOCATE_DEVNODE_NAME       = CM_Locate_DevNodeA'; `
  9.   CM_REENUMERATE_DEVNODE_NAME = CM_Reenumerate_DevNode'; `
  10.   CM_LOCATE_DEVNODE_NORMAL     = $00000000;
  11.   CR_SUCCESS                   = $00000000;
  12. var
  13.    DeviceNode: DWord;
  14.    HCfgMgr: Т-образная рукоятка;
  15.    CM_Locate_DevNode: функция (dnDevInst var: DWord; pDeviceID: PAnsiChar;
  16.                                ulFlags: ULONG): DWord; stdcall;
  17.    CM_Reenumerate_DevNode: функция (dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
  18. начните // ScanForHardwareChanges
  19.   Результат: = ЛОЖНО;
  20.   HCfgMgr: = LoadLibrary (CFGMGR32_DLL);
  21.   если (HCfgMgr <32), то
  22.   после этого MessageDlg (ошибка `: не смогл найти mtError менеджера DLL', конфигурации, [mbOk], 0)
  23.   еще начните
  24.     попытка
  25.       CM_Locate_DevNode: = GetProcAddress (HCfgMgr, CM_LOCATE_DEVNODE_NAME);
  26.       CM_Reenumerate_DevNode: = GetProcAddress (HCfgMgr, CM_REENUMERATE_DEVNODE_NAME);
  27.       если (CM_Locate_DevNode (DeviceNode, НОЛЬ, CM_LOCATE_DEVNODE_NORMAL) = CR_SUCCESS), то
  28.       после этого результат: = (CM_Reenumerate_DevNode (DeviceNode, 0) = CR_SUCCESS);
  29.     окончательно // оборачивает вверх
  30.       FreeLibrary (HCfgMgr);
  31.     конец;    попытка ///окончательно
  32.   конец;
  33. конец// ScanForHardwareChanges

Как тантьема, здесь совмещено в проект которому развертки для нового оборудования и после этого reboots компьютер.

Для того чтобы испытать это себя, как раз создайте основной проект project1 unit1, оденьте в TButton форма, наклеите этот текст над Кодом unit1 существующим, и после этого щелчок двойника кнопка. Вы после этого будете иметь compilable программу. Вы можете доработать его для того чтобы исключить форму если вы хотите и делаете все из этого начинаете и кончаетесь в блоке самом проекта.

Здесь вы идете:

ДЕЛФИ:
  1. **************************************************************************** //
  2. // Project1                                                                                                          04/Jan/2007
  3. //
  4. // написанное Брайан Неспециалистом (Capt Queeg AKA SilverPaladin AKA)
  5. // навещает он на http://www.TheCodeCave.com
  6. //
  7. // это просто демонстрация для того чтобы показать как программу Делфи можно использовать
  8. // для того чтобы обнаружить новое оборудование и reboot.
  9. //
  10. Предупреждение //: Я не могу думать любого путя что этот режим смог причинить вред к.
  11. // ваш компьютер, но хорошая передовая практика понять каждую линию
  12. // нового Кода перед вами бежит оно.  Кто знает чего смогл скрываться. Лучше
  13. // пока, не бежит этот пример на всех. Вы должны остановить теперь и erase
  14. // архивы.  Для если он причиняет голубой дым быть испущенным от вашей сети
  15. карточка //, если она стирает все потребителей от вашего компьютера, или если она делает вашим
  16. сестра // замкнула вулканизационный барабан при ее парень и старт законоведа датируя caver, его
  17. // нет моего недостатка.  (Фактически которого последнее одно могло быть улучшением, но
  18. // нет все еще моего недостатка.) Но факт дела, компьютеры
  19. // имеет разум их и мы программники живем на одичалой стороне.
  20. //
  21. Использование //: Project1.exe
  22. // бежит оно. Отожмите кнопку.  ПРЕДУПРЕЖДЕНИЕ ВАС REBOOT И MAY ОСВОБОДИТЬ РАБОТА.
  23. //
  24. История //:
  25. //    04/Jan/2007 - BL - Создано
  26. //
  27. **************************************************************************** //
  28. блок Unit1;
  29.  
  30. интерфейс
  31.  
  32. пользы
  33.   Windows, сообщения, SysUtils, типы, графики, управление, формы, диалоги,
  34.   StdCtrls, ShellAPI;
  35.  
  36. тип
  37.   TForm1 = тип (TForm)
  38.     Button1: TButton;
  39.     процедура Button1Click (прислужник: TObject);
  40.   приватно
  41.     {Приватные объявления}
  42.   публика
  43.     {Общественные объявления}
  44.   конец;
  45.  
  46. var
  47.   Form1: TForm1;
  48.  
  49. вставка
  50.  
  51. {$R *.DFM}
  52.  
  53. {******************************************************************************
  54.   SetTokenPrivilege
  55.   Функция хелпера которая включает или выводит специфические привилегированности из строя на
  56.   определенный компьютер.  НОЛЬ в SystemName значит что привилегированность будет а
  57.   для настоящего компьютера.  Любое другое значение должно сопрягать имя компьютера
  58.   на вашей сети.
  59. ******************************************************************************}
  60. процедура SetTokenPrivilege (aSystemName: PChar; aPrivilegeName: PChar; aEnabled: Булевско);
  61. var
  62.   TTokenHd: Т-образная рукоятка;
  63.   TTokenPvg: TTokenPrivileges;
  64.   cbtpPrevious: DWORD;
  65.   rTTokenPvg: TTokenPrivileges;
  66.   pcbtpPreviousRequired: DWORD;
  67.   TokenOpened, ValueFound: Булевско;
  68. const
  69.   Константы таможни //
  70.   // SE_PRIVILEGE_DISABLED = 0 предположение которое работает.
  71.   // значение по умолчанию я видел что восстановлены были 2012309862 I подозреваемое что были как раз биты старья
  72.   SE_PRIVILEGE_DISABLED = 0;
  73. начните // SetTokenPrivilege
  74.   // система привилегированности только имеющееся на NT и за пределами
  75.   если (Win32Platform = VER_PLATFORM_WIN32_NT), то
  76.   после этого начните
  77.     // восстановляет знак внимания который представляет эту настоящую встречу применения
  78.     TokenOpened: = OpenProcessToken (GetCurrentProcess (),
  79.                                     TOKEN_ADJUST_PRIVILEGES или TOKEN_QUERY,
  80.                                     TTokenHd);
  81.  
  82.     Проверка // для отказа
  83.     если (не TokenOpened), то
  84.     после этого повышение Exception.Create (`настоящий потребитель не имеет `доступа +
  85.                                 `требуемое, что побежать эта программа. ')
  86.     еще начните
  87.       // получает имя привилегированности (в виду того что Windows разноязычно, это необходимо сделать)
  88.       ValueFound: = LookupPrivilegeValue (aSystemName, aPrivilegeName, TTokenPvg.Privileges [0]. Luid);
  89.       TTokenPvg.PrivilegeCount: = 1;
  90.  
  91.       // включает или выводит флаг из строя согласно пройденному bool
  92.       если (aEnabled), то
  93.       после этого TTokenPvg.Privileges [0]. Атрибуты: = SE_PRIVILEGE_ENABLED
  94.       другое TTokenPvg.Privileges [0]. Атрибуты: = SE_PRIVILEGE_DISABLED; // видит объявление
  95.       cbtpPrevious: = SizeOf (rTTokenPvg);
  96.       pcbtpPreviousRequired: = 0;
  97.       если (не ValueFound), то
  98.       после этого повышение Exception.Create (`эта программа несовместимо с `+
  99.                                  операционная система `установленная на этот компьютер. ')
  100.       еще начните
  101.         попытка
  102.           // регулирует позволения как требовалось.
  103.           Windows.AdjustTokenPrivileges (TTokenHd, ложное, TTokenPvg, cbtpPrevious,
  104.                                         pcbtpPreviousRequired rTTokenPvg,);
  105.         за исключением
  106.           повышение Exception.Create (`настоящий потребитель не имеет необходимое `+
  107.                                  доступ `для того чтобы нагрузить крапивницу регистратуры. ')
  108.         конец;
  109.       конец;
  110.     конец
  111.   конец;
  112. конец// SetTokenPrivilege
  113.  
  114. {******************************************************************************
  115.   GrantPrivilege
  116.   Этот режим дарует привилегированности необходим для того чтобы достигнуть спрятанной крапивницы системы
  117.   и нагрузите его в память.
  118. ******************************************************************************}
  119. процедура GrantPrivilege (aPrivilegeName: Шнур);
  120. начните // GrantPrivilege
  121.   SetTokenPrivilege (НОЛИ, PChar (aPrivilegeName), TRUE);
  122. конец// GrantPrivilege
  123.  
  124. {******************************************************************************
  125.   RevokePrivilege
  126.   Этот режим отменяет привилегированности уступанные GrantPrivilege
  127. ******************************************************************************}
  128. процедура RevokePrivilege (aPrivilegeName: Шнур);
  129. начните // RevokePrivilege
  130.   SetTokenPrivilege (НОЛЬ, PChar (aPrivilegeName), ЛОЖНЫЕ);
  131. конец// RevokePrivilege
  132.  
  133. {******************************************************************************
  134.   RebootSystem
  135. ******************************************************************************}
  136. функция RebootSystem (сообщение: Шнур; Перерыв: DWord;
  137.                         ForceClose: WordBool = ЛОЖНО): WordBool;
  138. начните // RebootSystem
  139.   если (сообщение = ") после этого сообщение:, то= #0; //null прекращает для затем
  140.  
  141.   GrantPrivilege (SeShutdownPrivilege') `;
  142.   попытка
  143.     Результат: = InitiateSystemShutdown (НОЛИ, @Message [1], перерыв, ForceClose, TRUE);
  144.   окончательно
  145.     RevokePrivilege (SeShutdownPrivilege') `;
  146.   конец;
  147. конец// RebootSystem
  148.  
  149.  
  150. {******************************************************************************
  151.   ScanForHardwareChanges
  152. ******************************************************************************}
  153. функция ScanForHardwareChanges: Булевско;
  154. const
  155.   CFGMGR32_DLL                 = `cfgmgr32.dll';
  156.   CM_LOCATE_DEVNODE_NAME       = CM_Locate_DevNodeA'; `
  157.   CM_REENUMERATE_DEVNODE_NAME = CM_Reenumerate_DevNode'; `
  158.   CM_LOCATE_DEVNODE_NORMAL     = $00000000;
  159.   CR_SUCCESS                   = $00000000;
  160. var
  161.    DeviceNode: DWord;
  162.    HCfgMgr: Т-образная рукоятка;
  163.    CM_Locate_DevNode: функция (dnDevInst var: DWord; pDeviceID: PAnsiChar;
  164.                                ulFlags: ULONG): DWord; stdcall;
  165.    CM_Reenumerate_DevNode: функция (dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
  166. начните // ScanForHardwareChanges
  167.   Результат: = ЛОЖНО;
  168.   HCfgMgr: = LoadLibrary (CFGMGR32_DLL);
  169.   если (HCfgMgr <32), то
  170.   после этого MessageDlg (ошибка `: не смогл найти mtError менеджера DLL', конфигурации, [mbOk], 0)
  171.   еще начните
  172.     попытка
  173.       CM_Locate_DevNode: = GetProcAddress (HCfgMgr, CM_LOCATE_DEVNODE_NAME);
  174.       CM_Reenumerate_DevNode: = GetProcAddress (HCfgMgr, CM_REENUMERATE_DEVNODE_NAME);
  175.       если (CM_Locate_DevNode (DeviceNode, НОЛЬ, CM_LOCATE_DEVNODE_NORMAL) = CR_SUCCESS), то
  176.       после этого результат: = (CM_Reenumerate_DevNode (DeviceNode, 0) = CR_SUCCESS);
  177.     окончательно // оборачивает вверх
  178.       FreeLibrary (HCfgMgr);
  179.     конец;    попытка ///окончательно
  180.   конец;
  181. конец// ScanForHardwareChanges
  182.  
  183.  
  184. {******************************************************************************
  185.   Button1Click
  186. ******************************************************************************}
  187. процедура TForm1.Button1Click (прислужник: TObject);
  188. начните // Button1Click
  189.   если (ScanForHardwareChanges), то
  190.   после этого RebootSystem (изменение Successful', 15 оборудования `);
  191. конец// Button1Click
  192.  
  193. конец.

1 комментарий »

  1. Полтора года старая но все еще было полезно. Спасибо укомплектовывают личным составом ;) не могут стоять используя огромные архивы как раз для немного линий Кода…

    Комментирует кто-то - 1:08 pm 30-ое мая 2008 @

Питание RSS для комментариев на этом столбе. URL TrackBack

Выйдите комментарий