Вызовите развертку от Делфи, InstallShield обнаружения оборудования, C++, сценарий или побегите подсказка
В моем процессе раскрытия, он посмотрел как я шел обнаружить некоторые изменения в оборудовании и после этого выполнить reboot.
Я исследовал как сделать это но он поворачивает ou что мне не нужен этот Код. В подземелье он идет.
Вы можете конечно побежать «добавляете чудодей новое оборудование» вручную. Здесь линия передачи команд для того чтобы сделать как раз то:
«C:\WINDOWS\system32\rundll32.exe» C:\WINDOWS\system32\shell32.dll, Control_RunDLL «C:\WINDOWS\system32\hdwwiz.cpl», обнаруживает оборудование
Однако, что если вы хотите автоматизировать процесс.
Информация для как сделать это относительно вряд даже если страница technet о ей. Странно достаточно первая вещь я нашел был сценарием NSIS для делать это через ту программу instalation открытого источника. Странная вещь о ей что она находилась на вебсайте WinAMP (соединении).
Здесь тот Код:
-
Функция ScanForNewHW
-
Alwaysoff SetPluginUnload
-
StrCpy $1 «»
-
-
Система:: Setupapi звонока ':: ′ CM_Locate_DevNodeA (*i .r0, t r1, I r2) I .r3
-
Система:: Setupapi звонока ':: ′ CM_Reenumerate_DevNode (r0 I, I r4) I .r5
-
-
Руководство SetPluginUnload
-
Система:: Освободите 0
-
FunctionEnd
Подготовлено с именем DLL, вторая вещь я нашел был сценарием экрана устанавливать (соединением) который позволил ей быть сделанным:
-
функция ScanForHardwareChanges ()
-
devInst НОМЕРА, myreturn;
-
начните
-
если (UseDLL, то (^ «cfgmgr32.dll WINSYSDIR ")! = 0) после этого
-
MessageBox («не нагрузил Dll», СТРОГИЙ);
-
возвращенное ЛОЖНОЕ;
-
endif;
-
myreturn = CM_Locate_DevNodeA (&devInst, «\ 0 «, 0);
-
myreturn = CM_Reenumerate_DevNode (devInst, 0);
-
UnUseDLL (^ «cfgmgr32.dll WINSYSDIR ");
-
возвращенно TRUE;
-
конец;
Подготовлено с именем DLL и возможным именем процедуры, я мог отслеживать вниз страницу поддержки Майкрософт о ей (соединение). Та страница обеспечила режим A.C. для вызывать Код. Здесь она является следующим:
-
BOOL ScanForHardwareChanges ()
-
{
-
DEVINST devInst;
-
CONFIGRET состояние;
-
-
//
-
// получает devnode корня.
-
//
-
-
состояние = CM_Locate_DevNode (&devInst, NULL, CM_LOCATE_DEVNODE_NORMAL);
-
-
если (состояние! = CR_SUCCESS) {
-
возвращенное ЛОЖНОЕ;
-
-
}
-
-
состояние = CM_Reenumerate_DevNode (devInst, 0);
-
-
если (состояние! = CR_SUCCESS) {
-
возвращенное ЛОЖНОЕ;
-
}
-
-
возвращенно TRUE;
-
}
Однако, я хотел сделать это в Делфи. С правильно постоянн именами, я мог найти 2 справки к этому режиму. Проект Делфи JEDI имеет a обеспечивает режим для нагружать DLL который позволяет эти быть позвоненным и или кто-то (соединение) Код переведенного Майкрософта в режим для просматривать для оборудования или было теперь пойденное a, проект демонстрации JEDI который включил этот режим. Любой путь, французское место был первое одним я счесл то просмотрено для нового оборудования с Делфи.
Здесь тот Код:
-
процедура SomeProcedure;
-
// сперва вы потребность нагрузить модуль.
-
LoadConfigManagerApi;
-
// после этого вызывает перевод режима MS
-
ScanForHardwareChanges;
-
конец;
-
-
// здесь перевод ScanForHardwareChanges
-
функция ScanForHardwareChanges: булевско;
-
var
-
dev: DEVINST;
-
состояние: CONFIGRET;
-
начните
-
-
состояние: = CM_Locate_DevNode (dev,», CM_LOCATE_DEVNODE_NORMAL);
-
-
если (<> CR_SUCCESS состояния) после этого
-
начните
-
результат: = ЛОЖНО;
-
выход;
-
конец;
-
-
состояние: = CM_Reenumerate_DevNode (dev, 0);
-
-
если (<> CR_SUCCESS состояния) после этого
-
начните
-
результат: = ЛОЖНО;
-
выход;
-
конец;
-
Результат: = TRUE;
-
конец;
Что режим был выбран вверх на русском месте (соединении) и был доработан для того чтобы быть независимым архивов JEDI. Однако, оба из этих режимов включают путь больше информации чем необходим.
Процесс действительно просто.
1. Нагрузите DLL
2. Получите расположение 2 методов вам.
3. Вызовите их (используя соотвествующие константы
4. Расгрузите все.
Я писал мой собственный режим Делфи который делает вс то и не имеет никакой экстренный волочат багаж, котор (снадобье?) вдоль для езды.
Мое неразъемное разрешение:
-
{******************************************************************************
-
ScanForHardwareChanges
-
Брайан Неспециалистом на TheCodeCave.com
-
******************************************************************************}
-
функция ScanForHardwareChanges: Булевско;
-
const
-
CFGMGR32_DLL = `cfgmgr32.dll';
-
CM_LOCATE_DEVNODE_NAME = CM_Locate_DevNodeA'; `
-
CM_REENUMERATE_DEVNODE_NAME = CM_Reenumerate_DevNode'; `
-
CM_LOCATE_DEVNODE_NORMAL = $00000000;
-
CR_SUCCESS = $00000000;
-
var
-
DeviceNode: DWord;
-
HCfgMgr: Т-образная рукоятка;
-
CM_Locate_DevNode: функция (dnDevInst var: DWord; pDeviceID: PAnsiChar;
-
ulFlags: ULONG): DWord; stdcall;
-
CM_Reenumerate_DevNode: функция (dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
-
начните // ScanForHardwareChanges
-
Результат: = ЛОЖНО;
-
HCfgMgr: = LoadLibrary (CFGMGR32_DLL);
-
если (HCfgMgr <32), то
-
после этого MessageDlg (ошибка `: не смогл найти mtError менеджера DLL', конфигурации, [mbOk], 0)
-
еще начните
-
попытка
-
CM_Locate_DevNode: = GetProcAddress (HCfgMgr, CM_LOCATE_DEVNODE_NAME);
-
CM_Reenumerate_DevNode: = GetProcAddress (HCfgMgr, CM_REENUMERATE_DEVNODE_NAME);
-
если (CM_Locate_DevNode (DeviceNode, НОЛЬ, CM_LOCATE_DEVNODE_NORMAL) = CR_SUCCESS), то
-
после этого результат: = (CM_Reenumerate_DevNode (DeviceNode, 0) = CR_SUCCESS);
-
окончательно // оборачивает вверх
-
FreeLibrary (HCfgMgr);
-
конец; попытка ///окончательно
-
конец;
-
конец; // ScanForHardwareChanges
Как тантьема, здесь совмещено в проект которому развертки для нового оборудования и после этого reboots компьютер.
Для того чтобы испытать это себя, как раз создайте основной проект project1 unit1, оденьте в TButton форма, наклеите этот текст над Кодом unit1 существующим, и после этого щелчок двойника кнопка. Вы после этого будете иметь compilable программу. Вы можете доработать его для того чтобы исключить форму если вы хотите и делаете все из этого начинаете и кончаетесь в блоке самом проекта.
Здесь вы идете:
-
**************************************************************************** //
-
// Project1 04/Jan/2007
-
//
-
// написанное Брайан Неспециалистом (Capt Queeg AKA SilverPaladin AKA)
-
// навещает он на http://www.TheCodeCave.com
-
//
-
// это просто демонстрация для того чтобы показать как программу Делфи можно использовать
-
// для того чтобы обнаружить новое оборудование и reboot.
-
//
-
Предупреждение //: Я не могу думать любого путя что этот режим смог причинить вред к.
-
// ваш компьютер, но хорошая передовая практика понять каждую линию
-
// нового Кода перед вами бежит оно. Кто знает чего смогл скрываться. Лучше
-
// пока, не бежит этот пример на всех. Вы должны остановить теперь и erase
-
// архивы. Для если он причиняет голубой дым быть испущенным от вашей сети
-
карточка //, если она стирает все потребителей от вашего компьютера, или если она делает вашим
-
сестра // замкнула вулканизационный барабан при ее парень и старт законоведа датируя caver, его
-
// нет моего недостатка. (Фактически которого последнее одно могло быть улучшением, но
-
// нет все еще моего недостатка.) Но факт дела, компьютеры
-
// имеет разум их и мы программники живем на одичалой стороне.
-
//
-
Использование //: Project1.exe
-
// бежит оно. Отожмите кнопку. ПРЕДУПРЕЖДЕНИЕ ВАС REBOOT И MAY ОСВОБОДИТЬ РАБОТА.
-
//
-
История //:
-
// 04/Jan/2007 - BL - Создано
-
//
-
**************************************************************************** //
-
блок Unit1;
-
-
интерфейс
-
-
пользы
-
Windows, сообщения, SysUtils, типы, графики, управление, формы, диалоги,
-
StdCtrls, ShellAPI;
-
-
тип
-
TForm1 = тип (TForm)
-
Button1: TButton;
-
процедура Button1Click (прислужник: TObject);
-
приватно
-
{Приватные объявления}
-
публика
-
{Общественные объявления}
-
конец;
-
-
var
-
Form1: TForm1;
-
-
вставка
-
-
{$R *.DFM}
-
-
{******************************************************************************
-
SetTokenPrivilege
-
Функция хелпера которая включает или выводит специфические привилегированности из строя на
-
определенный компьютер. НОЛЬ в SystemName значит что привилегированность будет а
-
для настоящего компьютера. Любое другое значение должно сопрягать имя компьютера
-
на вашей сети.
-
******************************************************************************}
-
процедура SetTokenPrivilege (aSystemName: PChar; aPrivilegeName: PChar; aEnabled: Булевско);
-
var
-
TTokenHd: Т-образная рукоятка;
-
TTokenPvg: TTokenPrivileges;
-
cbtpPrevious: DWORD;
-
rTTokenPvg: TTokenPrivileges;
-
pcbtpPreviousRequired: DWORD;
-
TokenOpened, ValueFound: Булевско;
-
const
-
Константы таможни //
-
// SE_PRIVILEGE_DISABLED = 0 предположение которое работает.
-
// значение по умолчанию я видел что восстановлены были 2012309862 I подозреваемое что были как раз биты старья
-
SE_PRIVILEGE_DISABLED = 0;
-
начните // SetTokenPrivilege
-
// система привилегированности только имеющееся на NT и за пределами
-
если (Win32Platform = VER_PLATFORM_WIN32_NT), то
-
после этого начните
-
// восстановляет знак внимания который представляет эту настоящую встречу применения
-
TokenOpened: = OpenProcessToken (GetCurrentProcess (),
-
TOKEN_ADJUST_PRIVILEGES или TOKEN_QUERY,
-
TTokenHd);
-
-
Проверка // для отказа
-
если (не TokenOpened), то
-
после этого повышение Exception.Create (`настоящий потребитель не имеет `доступа +
-
`требуемое, что побежать эта программа. ')
-
еще начните
-
// получает имя привилегированности (в виду того что Windows разноязычно, это необходимо сделать)
-
ValueFound: = LookupPrivilegeValue (aSystemName, aPrivilegeName, TTokenPvg.Privileges [0]. Luid);
-
TTokenPvg.PrivilegeCount: = 1;
-
-
// включает или выводит флаг из строя согласно пройденному bool
-
если (aEnabled), то
-
после этого TTokenPvg.Privileges [0]. Атрибуты: = SE_PRIVILEGE_ENABLED
-
другое TTokenPvg.Privileges [0]. Атрибуты: = SE_PRIVILEGE_DISABLED; // видит объявление
-
cbtpPrevious: = SizeOf (rTTokenPvg);
-
pcbtpPreviousRequired: = 0;
-
если (не ValueFound), то
-
после этого повышение Exception.Create (`эта программа несовместимо с `+
-
операционная система `установленная на этот компьютер. ')
-
еще начните
-
попытка
-
// регулирует позволения как требовалось.
-
Windows.AdjustTokenPrivileges (TTokenHd, ложное, TTokenPvg, cbtpPrevious,
-
pcbtpPreviousRequired rTTokenPvg,);
-
за исключением
-
повышение Exception.Create (`настоящий потребитель не имеет необходимое `+
-
доступ `для того чтобы нагрузить крапивницу регистратуры. ')
-
конец;
-
конец;
-
конец
-
конец;
-
конец; // SetTokenPrivilege
-
-
{******************************************************************************
-
GrantPrivilege
-
Этот режим дарует привилегированности необходим для того чтобы достигнуть спрятанной крапивницы системы
-
и нагрузите его в память.
-
******************************************************************************}
-
процедура GrantPrivilege (aPrivilegeName: Шнур);
-
начните // GrantPrivilege
-
SetTokenPrivilege (НОЛИ, PChar (aPrivilegeName), TRUE);
-
конец; // GrantPrivilege
-
-
{******************************************************************************
-
RevokePrivilege
-
Этот режим отменяет привилегированности уступанные GrantPrivilege
-
******************************************************************************}
-
процедура RevokePrivilege (aPrivilegeName: Шнур);
-
начните // RevokePrivilege
-
SetTokenPrivilege (НОЛЬ, PChar (aPrivilegeName), ЛОЖНЫЕ);
-
конец; // RevokePrivilege
-
-
{******************************************************************************
-
RebootSystem
-
******************************************************************************}
-
функция RebootSystem (сообщение: Шнур; Перерыв: DWord;
-
ForceClose: WordBool = ЛОЖНО): WordBool;
-
начните // RebootSystem
-
если (сообщение = ") после этого сообщение:, то= #0; //null прекращает для затем
-
-
GrantPrivilege (SeShutdownPrivilege') `;
-
попытка
-
Результат: = InitiateSystemShutdown (НОЛИ, @Message [1], перерыв, ForceClose, TRUE);
-
окончательно
-
RevokePrivilege (SeShutdownPrivilege') `;
-
конец;
-
конец; // RebootSystem
-
-
-
{******************************************************************************
-
ScanForHardwareChanges
-
******************************************************************************}
-
функция ScanForHardwareChanges: Булевско;
-
const
-
CFGMGR32_DLL = `cfgmgr32.dll';
-
CM_LOCATE_DEVNODE_NAME = CM_Locate_DevNodeA'; `
-
CM_REENUMERATE_DEVNODE_NAME = CM_Reenumerate_DevNode'; `
-
CM_LOCATE_DEVNODE_NORMAL = $00000000;
-
CR_SUCCESS = $00000000;
-
var
-
DeviceNode: DWord;
-
HCfgMgr: Т-образная рукоятка;
-
CM_Locate_DevNode: функция (dnDevInst var: DWord; pDeviceID: PAnsiChar;
-
ulFlags: ULONG): DWord; stdcall;
-
CM_Reenumerate_DevNode: функция (dnDevInst: DWord; ulFlags: ULong): DWord; stdcall;
-
начните // ScanForHardwareChanges
-
Результат: = ЛОЖНО;
-
HCfgMgr: = LoadLibrary (CFGMGR32_DLL);
-
если (HCfgMgr <32), то
-
после этого MessageDlg (ошибка `: не смогл найти mtError менеджера DLL', конфигурации, [mbOk], 0)
-
еще начните
-
попытка
-
CM_Locate_DevNode: = GetProcAddress (HCfgMgr, CM_LOCATE_DEVNODE_NAME);
-
CM_Reenumerate_DevNode: = GetProcAddress (HCfgMgr, CM_REENUMERATE_DEVNODE_NAME);
-
если (CM_Locate_DevNode (DeviceNode, НОЛЬ, CM_LOCATE_DEVNODE_NORMAL) = CR_SUCCESS), то
-
после этого результат: = (CM_Reenumerate_DevNode (DeviceNode, 0) = CR_SUCCESS);
-
окончательно // оборачивает вверх
-
FreeLibrary (HCfgMgr);
-
конец; попытка ///окончательно
-
конец;
-
конец; // ScanForHardwareChanges
-
-
-
{******************************************************************************
-
Button1Click
-
******************************************************************************}
-
процедура TForm1.Button1Click (прислужник: TObject);
-
начните // Button1Click
-
если (ScanForHardwareChanges), то
-
после этого RebootSystem (изменение Successful', 15 оборудования `);
-
конец; // Button1Click
-
-
конец.














Полтора года старая но все еще было полезно. Спасибо укомплектовывают личным составом
не могут стоять используя огромные архивы как раз для немного линий Кода…
Комментирует кто-то - 1:08 pm 30-ое мая 2008 @