![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
embedded null ветка реестра [D7, WinXP]
3she1on © (2008-10-15 03:32:00)Доброго времени суток, господа. Столкнулся с такой проблемой: есть в реестре ветка, содержащая нулевой символ в конце имени (допустим, hkcu\Software\smth* - символом '*' заменен нулевой символ) и необходим код, с помощью которого эту ветку можно будет удалить. Гугл вразумительных ответов не дал (или я не понял его ответов ))) ). Заранее благодарен!
3she1on (2008-10-15 19:51:00) [1]Вопрос закрыт. Всем спасибо )
3she1on (2008-10-15 16:41:00) [2]Ну вот и косяки снова вылезли (. Нашел в сети Си-шный код Руссиновича, адаптированный под Делфи, потом адаптировал его "под себя".
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, StdCtrls;
type
TForm1 = class(TForm)
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
// DEFINE MISSING CONSTANTS
const
ntdll = 'ntdll.dll';
OBJ_CASE_INSENSITIVE = $00000040;
// DEFINE MISSING TYPE DECLARATIONS
type
USHORT = WORD;
NTSTATUS = ULONG;
PVOID = Pointer;
// TRANSLATE MACRO
function NT_SUCCESS(Status: Integer): WordBool;
begin
Result := Status >= 0;
end;
// DEFINE Native API UNICODE STRING
type
TUnicodeString = packed record
Length: USHORT;
MaximumLength: USHORT;
Buffer: PWideChar;
end;
UNICODE_STRING = TUnicodeString;
PUNICODE_STRING = ^UNICODE_STRING;
// DEFINE Native API OBJECT ATTRIBUTES
TObjectAttributes = packed record
Length: ULONG;
RootDirectory: THandle;
ObjectName: PUNICODE_STRING;
Attributes: ULONG;
SecurityDescriptor: PVOID; // Points to type SECURITY_DESCRIPTOR
SecurityQualityOfService: PVOID; // Points to type SECURITY_QUALITY_OF_SERVICE
end;
OBJECT_ATTRIBUTES = TObjectAttributes;
POBJECT_ATTRIBUTES = ^OBJECT_ATTRIBUTES;
// TRANSLATE MACRO
procedure InitializeObjectAttributes(var p: TObjectAttributes; n:
PUNICODE_STRING; a: ULONG; r: THandle; s: PVOID);
begin
p.Length := SizeOf(OBJECT_ATTRIBUTES);
p.RootDirectory := r;
p.Attributes := a;
p.ObjectName := n;
p.SecurityDescriptor := s;
p.SecurityQualityOfService := nil;
end;
// IMPORT NTDLL FUNCTIONS
function NtCreateKey(var KeyHandle: THandle; DesiredAccess: ULONG; var
ObjectAttributes: OBJECT_ATTRIBUTES; TitleIndex: ULONG; Class_:
PUNICODE_STRING; CreateOptions: ULONG; var Disposition: ULONG): NTSTATUS;
stdcall; external ntdll name 'NtCreateKey';
function NtSetValueKey(KeyHandle: THandle; ValueName: PUNICODE_STRING;
TitleIndex: ULONG; Type_: ULONG; Data: PVOID; DataSize: ULONG): NTSTATUS;
stdcall; external ntdll name 'NtSetValueKey';
function NtDeleteKey(KeyHandle: THandle): NTSTATUS; stdcall; external ntdll
name 'NtDeleteKey';
// DEFINE OUR REGISTY STRINGS
const
KeyNameBuffer: AnsiString = '\Registry\User\CurrentUser\Software';
NewKeyNameBuffer: AnsiString = 'Shodans Tech';
HiddenKeyNameBuffer: AnsiString = 'Can''t touch me!'#0;
HiddenValueNameBuffer: AnsiString = 'Hidden Value';
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
KeyName, ValueName: UNICODE_STRING;
SoftwareKeyHandle, SysKeyHandle, HiddenKeyHandle: THandle;
Status: ULONG;
ObjectAttributes: OBJECT_ATTRIBUTES;
Disposition: ULONG;
Buffer: array of WideChar;
begin
//
// Open the Software key
//
SetLength(Buffer, Length(KeyNameBuffer));
MultiByteToWideChar(CP_UTF8, 0, @KeyNameBuffer[1], Length(KeyNameBuffer),
PWideChar(Buffer), Length(Buffer));
KeyName.Buffer := @Buffer[0];
KeyName.Length := Length(KeyNameBuffer) * SizeOf(WideChar);
InitializeObjectAttributes(ObjectAttributes, @KeyName, OBJ_CASE_INSENSITIVE,
0, nil);
Status := NtCreateKey(SoftwareKeyHandle, KEY_ALL_ACCESS, ObjectAttributes, 0,
nil, REG_OPTION_NON_VOLATILE, Disposition);
if not NT_SUCCESS(Status) then
raise Exception.Create('Error: Couldn''t open HKCU\Software');
.........
.........
end.
Интересно, что при значении константы
KeyNameBuffer: AnsiString = '\Registry\Machine\Software';
все работает отлично. Но... мне нужно попасть не в HKLM, а в HKCU!
При изменении пути к кусту
KeyNameBuffer: AnsiString = '\Registry\User\CurrentUser\Software';
получаю эксепшн.
3she1on (2008-10-15 12:31:00) [3]Пре велико много благодарен Вам, Riply! )
Riply (2008-10-15 04:38:00) [4]> [0] 3she1on © (15.10.08 03:32)
> Столкнулся с такой проблемой: есть в реестре ветка, содержащая нулевой символ в конце
> имени (допустим, hkcu\Software\smth* - символом '*' заменен нулевой символ) и необходим код
> с помощью которого эту ветку можно будет удалить
NtCreateKey, NtDeleteKey "спасут Отца Русской Демократии" :)