Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Использование RegSaveKey [D7, WinXP]


The One ©   (2005-11-16 20:55:00) 

Здравствуйте уважаемые мастера.
В своем ПО мне необходимо сохранять некий ключ рееста Win NT. Вызываю API функцию RegSaveKey(KeyHandle,'C:\1.reg',nil), создается пустой файл. Значение возвращаемое функцией - 1314, которое описанно как ERROR_PRIVILEGE_NOT_HELD, т.е. видимо дело в последнем параметре, который задан как nil, что должно было бы по идеи установить привилегии принятые по умолчанию. Ктому же в исходниках TRegistry данная API-функция вызывается также. В чем же всетаки здесь проблемма?

ЗЫ: Заранее благодарю.


The One   (2005-11-19 18:27:00) [1]

Да уж, невнимателен, там же по-русски написанно: Implemented as RegSaveKeyExW (Unicode) and RegSaveKeyExA (ANSI).=)

В любом случае создается тот же файл.


Джо   (2005-11-19 17:31:00) [2]

А, кстати, если на XP, то укажи name 'RegSaveKeyExA' или 'RegSaveKeyExW'для Юникод-версии.


Джо   (2005-11-19 17:29:00) [3]


>  [9] The One ©   (19.11.05 17:07)

Мда, Requires Windows "Longhorn" or Windows XP. Может, не на XP проверяешь?


The One   (2005-11-19 17:07:00) [4]

На msdn нашел описание. Там сказанно, что функция хранится в advapi32.dll
function  RegSaveKeyEx(hKey:HKEY;lpFile:LPCTSTR;lpSecurityAttributes:PSECURITYATTRIBUTES; Flags:DWORD):longint; stdcall; external 'advapi32.dll';
вот так я её описал.
Но при загрузке моей dll выдается сообщение, что Точка входа в процедуру RegSaveKeyEx не найдена в библиотеке DLL Advapi32.dll
Что тут не так?


Джо   (2005-11-19 16:28:00) [5]

Может, воспользоваться RegSaveKeyEx? Он, кажется, позволяет формат выбрать (не проверял).


Anatoly Podgoretsky   (2005-11-19 16:21:00) [6]

Не билиберда а двоичные данные, а файл реестра ни кто и не обещал, только это. Хочешь файл реестра, то сам пиши в текстовом виде, рекурсивно и в соответствии с форматом. Или используй RegEdit


The One   (2005-11-19 15:20:00) [7]

Нарисовалась еще одна проблемма. Использую RegSaveKey. Значение возвращаемое функцие ERROR_SUCCESS. Файл создан, но в нём какае-то билиберда:
regf\x1   \x1           \x1   \x3       \x1        \x10  \x1                                                                   \x7F\x7F\x7F\x1            П––яЬШШяаЯЯяЪССяЬММяД¬¬яі€€ы    \x1\x1\x1d\x1\x1\x1G\x1\x1\x1D\x2\x2\x27\x4\x4\x4\x1D\x12\x12\x12\x7        П––ятттясссяЮЭЭяЪїїяЛџџяї‘‘я1!!И4$$»7$$ґ\x1D\x14\x14§   Њ\x1\x1\x1`\x3\x3\x3%\x19\x19\x19\x5    ё  Jї––яЯїїяШДДяП––яЛzzяѕ‰‰яї––яї––яї––яї––яxYYе   –\x1\x1\x1J\x7\x7\x7\x10  

При попытки выполнить его Винда сообщает, что это не файл реестра. Помогите плиз разобраться, что это за пакость?


The One   (2005-11-17 23:15:00) [8]


> SE_BACKUP_NAME

Всеж наверное и так и так верно ) Счас вот вчитался и понял, что SE_BACKUP_NAME - эт некая константа, а вот в вышеописаную процедуру следует передавать строку 'SeBackupPrivilege'.

А так все работает. Спасибо за помошь.


Игорь Шевченко   (2005-11-17 22:26:00) [9]


> SE_BACKUP_NAME


Виноват, перепутал, действительно SE_BACKUP_NAME

Попробуй так:

function HSEnablePrivilege (const PrivilegeName: String): Boolean;
var
 LUID: TLargeInteger;
 Priv: TTokenPrivileges;
 AccessToken: THandle;
 ReturnLen: Cardinal;
begin
 Result := OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,
                            AccessToken);
 if not Result then
   Exit;
 Result := LookupPrivilegeValueA(nil, PChar(PrivilegeName), LUID);
 if not Result then //Привилегия не нашлась
   Exit;
 Priv.PrivilegeCount := 1;
 Priv.Privileges[0].Luid := LUID;
 Priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
 Result := AdjustTokenPrivileges(AccessToken, false, Priv,
           SizeOf(TTokenPrivileges), nil, ReturnLen);
end;


The One   (2005-11-17 21:21:00) [10]

Залез на мсдн, обнаружил там сей примерчик:
[url] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/seccrypto/security/setting_the_backup_and_restore_privileges.asp[/url]
С Си я не очень дружу, посему перевел код так:

var
CurrProc:cardinal;
NewState:TOKEN_PRIVILEGES ;
luid:Int64;
hToken:cardinal ;
....
//в одной из функций выполняющихся в момент присоединения dll к процессу
CurrProc := GetCurrentProcess;
OpenProcessToken(CurrProc,TOKEN_ADJUST_PRIVILEGES and TOKEN_QUERY,hToken );
LookupPrivilegeValue(nil,'SE_BACKUP_PRIVILEGE',luid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
NewState.Privileges[0].Attributes :=(SE_PRIVILEGE_ENABLED);{??? пример с мсдн в этом строчке я дословно перевести не смог, посему просто отбросил "лишнее"}
AdjustTokenPrivileges(hToken,FALSE,NewState,0,nil,car);
CloseHandle(hToken);


Все компилируется на ура. Программа не вылетает, что уже радует, но ошибка вся таже - ERROR_PRIVILEGE_NOT_HELD


The One   (2005-11-17 20:23:00) [11]

Установи себе SE_BACKUP_PRIVILEGE
Согласно справке - SE_BACKUP_NAME. Вопрос в том, как дать эту привелегию процессу?


Игорь Шевченко   (2005-11-17 10:05:00) [12]

Установи себе SE_BACKUP_PRIVILEGE


Наверх

Титульная страница Поиск, карта сайта Написать письмо