PDA

Показать полную графическую версию : [утилита] Установка неподписанных драйверов


simplix
19-06-2008, 10:35
Нашёл исходник утилиты, которая позволяет корректно вычислять PrivateHash для выбора параметра "Пропускать", при установке драйвера без цифровой подписи.


#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>

#define HP_HASHVALUE HP_HASHVAL

/* This program turns the Driver signing Policy On/Off for Windows XP */
* Written by Stefan `Sec` Zehl <sec@xxxxxx>, 15.11.2004
*
* Thanks to sysinternals.com for regmon and apispy
* to msdn.microsoft.com for windows reference
* to cygwin for their environment
*/

void MyHandleError(char *s){
printf("Error: %s, number %x\n.",s,(unsigned int)GetLastError());
exit(1);
}
//--------------------------------------------------------------------
int main(void){
HCRYPTPROV hCryptProv;
HCRYPTHASH hHash;
BYTE data[16];
DWORD len;
DWORD seed;
HKEY hkey;
BYTE onoff=0; // This is the On/Off toggle
char input[4];
int x;

// HKLM\System\WPA\PnP\seed
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"System\\WPA\\PnP",
0,
KEY_READ,
&hkey
)==ERROR_SUCCESS){
printf("RegOpenKey sucess\n");
}else{
printf("RegOpenKey failure\n");
};

len=sizeof(seed);
if(RegQueryValueEx(
hkey,
"seed",
NULL,
NULL,
(BYTE*)&seed,
&len
)==ERROR_SUCCESS){
printf("RegQueryValue sucess\n");
}else{
printf("RegQueryValue failure\n");
};

if(hkey)
RegCloseKey(hkey);

printf("Seed=%x\n",(unsigned int)seed);

printf("Hello, World\n");
if(CryptAcquireContext(
&hCryptProv,
NULL,
NULL,
PROV_RSA_FULL,
0))
{
printf("CryptAcquireContext complete. \n");
} else {
MyHandleError("Acquisition of context failed.");
}
//--------------------------------------------------------------------
// Create a hash object.

if(CryptCreateHash(
hCryptProv,
CALG_MD5,
0,
0,
&hHash))
{
printf("An empty hash object has been created. \n");
} else {
MyHandleError("Error during CryptBeginHash!\n");
}
//--------------------------------------------------------------------
// Compute the cryptographic hash on the data.

input[0]=0;
input[1]=onoff; // This is the Value!
input[2]=0;
input[3]=0;

if(CryptHashData(
hHash,
input,
sizeof(input),
0))
{
printf("The data has been hashed. \n");
} else {
MyHandleError("Error during CPHashData!\n");
}
//--------------------------------------------------------------------

if(CryptHashData(
hHash,
(BYTE*)&seed,
sizeof(seed),
0))
{
printf("The data has been hashed. \n");
} else {
MyHandleError("Error during CPHashData!\n");
}
//--------------------------------------------------------------------
len=sizeof(data);
if( CryptGetHashParam(
hHash,
HP_HASHVALUE,
data,
&len,
0))
{
printf("The hash has been retrieved. \n");
} else {
MyHandleError("Error during CPGetHashParam!\n");
}

//--------------------------------------------------------------------
// Clean up.

// Destroy the hash object.

if(hHash) {
if(!(CryptDestroyHash(hHash)))
MyHandleError("Error during CryptDestroyHash");
}

// Release the CSP.

if(hCryptProv) {
if(!(CryptReleaseContext(hCryptProv,0)))
MyHandleError("Error during CryptReleaseContext");
}

printf("Hash: ");
for(x=0;x<sizeof(data);x++){
printf("%x ",data[x]);
};
printf("\nCreate md5 hash completed without error. \n");

//--------------------------------------------------------------------
// HKLM\Software\Microsoft\Windows\CurrentVersion\Setup\PrivateHash
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\Setup",
0,
KEY_WRITE,
&hkey
)==ERROR_SUCCESS){
printf("RegOpenKey sucess\n");
}else{
printf("RegOpenKey failure\n");
};

len=sizeof(seed);
if(RegSetValueEx(
hkey,
"PrivateHash",
0,
REG_BINARY,
data,
sizeof(data)
)==ERROR_SUCCESS){
printf("RegSetValueEx sucess\n");
}else{
printf("RegSetValueEx failure\n");
};

if(hkey)
RegCloseKey(hkey);
//--------------------------------------------------------------------
// HKLM\Software\Microsoft\Driver Signing\Policy
if(RegOpenKeyEx(
HKEY_CURRENT_USER,
"Software\\Microsoft\\Driver Signing",
0,
KEY_WRITE,
&hkey
)==ERROR_SUCCESS){
printf("RegOpenKey sucess\n");
}else{
printf("RegOpenKey failure\n");
};

len=sizeof(seed);
if(RegSetValueEx(
hkey,
"Policy",
0,
REG_BINARY,
&onoff,
1
)==ERROR_SUCCESS){
printf("RegSetValueEx sucess\n");
}else{
printf("RegSetValueEx failure\n");
};
if(hkey)
RegCloseKey(hkey);

//--------------------------------------------------------------------
// HKLM\Software\Microsoft\Driver Signing\Policy
if(RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Driver Signing",
0,
KEY_WRITE,
&hkey
)==ERROR_SUCCESS){
printf("RegOpenKey sucess\n");
}else{
printf("RegOpenKey failure\n");
};

len=sizeof(seed);
if(RegSetValueEx(
hkey,
"Policy",
0,
REG_BINARY,
&onoff,
1
)==ERROR_SUCCESS){
printf("RegSetValueEx sucess\n");
}else{
printf("RegSetValueEx failure\n");
};
if(hkey)
RegCloseKey(hkey);

exit(0);
}

Во вложении - скомпилированная утилита, которая корректно устанавливает нужный параметр (проверено на XP и 2003). Пригодится всем, кто имеет дело с установкой драйверов - утилиту достаточно запустить перед установкой неподписанного драйвера и он установится молча, т. к. выбор политики сработает мгновенно.

Berline
19-06-2008, 14:09
Вопрос: можно ли как нибуть орагнизовать запуск утилитки "после 1й автозагрузки"? К примеру из RunOnceEx поставили всё что нам нужно, он перегрузился, и типа при первом "чистом" логоне запустилась прога, и в этот сеанс мы ставим дровишки...

simplix
19-06-2008, 14:29
Можно элементарно сделать аддон, который запустит программку на T13 и после этого можно ставить свои драйвера.

Berline
19-06-2008, 14:45
simplix, наверн я не пральн понял... достаточно однократного запуска программы, и в дальнейшем всё будет тип топ?
или нужно каждый раз в текущем сеансе запускать утилиту?

yurfed
19-06-2008, 14:50
Установка неподписанных драйверов »
А чем не нравится средство диагностики "dxdiag", при запуске ответить нет и убрать птичку на отмеченом красным? Зачем огород городить?
http://keep4u.ru/imgs/b/080619/32/32354d4f7cdcc002ea.jpg

Berline
19-06-2008, 15:07
yurfed, dxdiag - лишние телодвижения... PrivateHash - ни консольных окон, ни диалогов не понятных! Имхо...

simplix
19-06-2008, 15:24
достаточно однократного запуска программы »
Да.

yurfed, Вас не туда занесло, параметр находится здесь:
Свойства системы => Оборудование => Подписывание драйверов

http://img170.imageshack.us/img170/9886/ignorekk6.jpg

yurfed
19-06-2008, 15:36
simplix, ну да, немного не туда нажал, но и то, что сказал, тоже, снимает проверку.PrivateHash - ни консольных окон, ни диалогов не понятных! Имхо... » Про какие консольные окна речь? http://files.myopera.com/Creat0R/Opera_AC/Icons/VeryCool_cool.gif

Berline
19-06-2008, 15:41
yurfed, сие было приведено в пример образно... :tongue:

simplix
19-06-2008, 15:42
но и то, что сказал, тоже, снимает проверку »
Это вообще из другой песни и к теме не имеет отношения...

Речь о том, что документированно нельзя (http://support.microsoft.com/kb/298503) управлять этим чекбоксом программно. То есть уже можно...

Mr dUSHA
19-06-2008, 17:55
Можно элементарно сделать аддон, который запустит программку на T13 и после этого можно ставить свои драйвера.

Речь о том, что документированно нельзя управлять этим чекбоксом программно. То есть уже можно...
»

Для автоустановки можно просто прописать соответствующие параметры в winnt.sif. Эффект будет аналогичный.
А этот исходник наш BoaSoft давно уже с успехом применяет в своем проекте по интеграции драйверов. :-)

Кроме того о других методах политикой чеерез недокументированую функцию pGetRealSystemTime смотрите здесь
http://forum.oszone.net/thread-106849.html

simplix
19-06-2008, 18:13
Для автоустановки можно просто прописать соответствующие параметры в winnt.sif »
А если нужно будет установить драйвер на установленной системе или во время обычной установки? Нужна универсальность, а т. к. размера у файла практически нету, то его можно применять в любом удобном случае (непосредственно перед установкой драйвера) - и всё будет корректно.
А этот исходник наш BoaSoft давно уже с успехом применяет в своем проекте по интеграции драйверов. »
Исходнику уже больше 4-х лет, надыбал его на просторах гугля )) А вот утилиты такой нигде не видел, теперь будет.

_AJ_
05-05-2011, 21:38
yurfed, Вас не туда занесло, параметр находится здесь:
Свойства системы => Оборудование => Подписывание драйверов »

простите, уточните версию win 7. у меня в профессиональной нет подписывания

SOLON7
05-06-2011, 16:20
Использую для установки драйверов следующие функции
UpdateDriverForPlugAndPlayDevicesA
DriverPackageInstallA

1.Возможно будет установить Неподписанные дрова с этой тулзой ??
2.На 2k,xp,6,7 ???

q28q
02-08-2011, 16:42
Отличная идея,все дрова ставятся. Но почемуто не работает удаленно через psexec, а хотелось бы.


Ошибка: 0x80090016L The provider DLL file does not exist or is not on the current path. И я думаю это не правдивая информация об ошибке, прога ни пытается открывать нестандартные dll.


И уже я разабрался, если такая ошибка то нужно выполнить CryptAcquireContext еще раз с параметром CRYPT_NEWKEYSET

Прикрепил исправленую версию

Freddy1984
28-03-2012, 20:37
Здравствуйте! Скажите пожалуйста, данная утилита может заменить WatchDriverSigningPolicy?
Почему спрашиваю? Потому что WatchDriverSigningPolicy переодически не срабатывает, и появляется окно о предупреждении о неподписанных драйверах.

the_doom
28-03-2012, 22:04
делал подобный по назначению скрипт на Sign of misery, который искал окно по заголовку и нажимал в нем Yes. только для русской\английской\64битной winxp пришлось писать разные версии, тк текст сообщений везде разный. надеюсь эта прога заменит те скрипты. потестю как оно.

Guman
18-06-2012, 11:37
simplix, что скажеш насчет версии от q28qОтличная идея,все дрова ставятся. Но почемуто не работает удаленно через psexec, а хотелось бы.
Ошибка: 0x80090016L The provider DLL file does not exist or is not on the current path. И я думаю это не правдивая информация об ошибке, прога ни пытается открывать нестандартные dll.
И уже я разабрался, если такая ошибка то нужно выполнить CryptAcquireContext еще раз с параметром CRYPT_NEWKEYSET
Прикрепил исправленую версию
Вложения
ph.7z
(1.5 Kb, 27 просмотров) »

Это исправление или наоборот.... какой версие пользоваться твоей или же его

rensaid
03-12-2015, 23:08
Установил драйвер на Windows XP 64 для принтера HP LaserJet 1010 от Widows Vista 64, потому что другого нет. Но я не помню, как это сделал. Благополочно забыл и не могу вспомнить. При установке программа упорно завирает, будто бы мой драйвер не предназначен для 64-битных процессоров.
Кажется, ставил Iorbit Driver под семёркой, делал инсталлятор для этого драйвера и потом устанавливал его под XP. Но мне кажется, что должен быть способ проще. Есть соображения? Еще подходит универсальный драйвер от HP, но я точно помню, что печатал драйвером Висты.

Guman
11-05-2024, 11:33
q28q, Пробовал через SetupComplete.cmd, не работает, на живой винде семерке , тоже не работает, как заставить его работать




© OSzone.net 2001-2012