Леонид,
nesco, какие Вы эамечательные!
------------ Дoбавленo в 12.16:Ну значется так:
Я, такой-секой, не мазанный, находясь в здравой памяти подтверждою всё сказанное на медне.
Вот рабочий some_ntdef.pas (пока на delphi7)
Вот консольное приложение:
program dirinfo_nt;
{$APPTYPE CONSOLE}
uses
windows, some_ntdef;
var
RootDirectoryName : UNICODE_STRING;
EntryName : UNICODE_STRING;
RootAnsiName : ANSI_STRING;
RootDirectoryAttributes: OBJECT_ATTRIBUTES;
Status : NTSTATUS;
RootDirectoryHandle : HANDLE;
Iosb: IO_STATUS_BLOCK;
Event : HANDLE;
Buffer:array [0..65535] of byte;
DirInformation : PFILE_BOTH_DIR_INFORMATION;
begin
// We use the name DosDevices rather than ?? so that it works on NT 3.51 as well as NT 4.0
RtlInitUnicodeString(@RootDirectoryName, '\DosDevices\C:\');
// Now open it
InitializeObjectAttributes(@RootDirectoryAttributes,
@RootDirectoryName,OBJ_CASE_INSENSITIVE,
0, // absolute open, no relative directory handle
nil // no security descriptor necessary
);
Status := NtCreateFile(@RootDirectoryHandle,
GENERIC_READ,
@RootDirectoryAttributes,
@Iosb,
nil, // no meaning for allocation
FILE_ATTRIBUTE_DIRECTORY, // MUST be a directory
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, // share all
FILE_OPEN, // must already exist
FILE_DIRECTORY_FILE, // MUST be a directory
nil,0);
if (not NT_SUCCESS(Status)) then
begin
writeln('Unable to open root directory, error = ',Status);
halt(Status);
end;
// Create an event
Status := NtCreateEvent(@Event,
GENERIC_ALL,
nil, // no object attributes
NotificationEvent,FALSE);
if (not NT_SUCCESS(Status)) then
begin
writeln('Event creation failed with error = ',Status);
halt(Status);
end;
// We pass NO NAME which is the same as *.*
Status := NtQueryDirectoryFile(RootDirectoryHandle,Event,
nil, // No APC routine
nil, // No APC context
@Iosb,
@Buffer,
length(Buffer),
FileBothDirectoryInformation,
FALSE,
nil,
FALSE);
// If the directory operation is in progress, wait for it to finish.
if (Status = STATUS_PENDING) then Status := NtWaitForSingleObject(Event, TRUE, nil);
// Check for errors.
if (not NT_SUCCESS(Status)) then
begin
writeln('Unable to query directory contents, error = ',Status);
halt(Status)
end;
// Note that as this is an example we're not ITERATING over the directory. To
// do so we should use a loop and query the directory AGAIN until we get back
// STATUS_NO_MORE_FILES. If the directory was TOTALLY EMPTY we'd get back
// STATUS_NO_SUCH_FILE - but only the ROOT directory can ever be TOTALLY EMPTY.
DirInformation := PFILE_BOTH_DIR_INFORMATION(@Buffer);
writeln('File/Dir Name, Allocation_Size');
writeln('------------------------------',#13#10);
while true do
begin
EntryName.MaximumLength := DirInformation^.FileNameLength;
EntryName.Length := DirInformation^.FileNameLength;
EntryName.Buffer := @DirInformation^.FileName;
RtlUnicodeStringToAnsiString(@RootAnsiName,@EntryName,TRUE);
// Dump the full name of the file. We could dump the other information
// here as well, but we'll keep the example shorter instead.
writeln(RootAnsiName.Buffer,', ',DirInformation^.AllocationSize.QuadPart);
// If there is no offset in the entry, the buffer has been exhausted.
if (DirInformation^.NextEntryOffset=0) then break else
begin
// Advance to the next entry.
DirInformation := PFILE_BOTH_DIR_INFORMATION(Cardinal(DirInformation)+DirInformation^.NextEntryOffset);
end;
// Skip a line
writeln;
end; //while
// Note that we skip closing our handles. The process death will do it for us.
halt(STATUS_SUCCESS)
end.
Пока не адаптировал под IC, какие-то ошибки были с delphi4, не помню.
Пока больший интерес вызывают вышеобозначенные функции. Пока хочу с ними поиграть.
[flood]
Для тех, кто в поиске рецептов - рассказываю:
Чтобы чувствовать себя хорошо, надо употребить ровно половину того, что было выпито вчера и не рюмкой больше и ни какого пива!!!
Неправильное похмелье приводит к длительному запою. Это золотое правило.
(Удивительно, но если Вы вчера приняли на грудь 3 литра, то выпив сегодня полтора литра Вы вовсе не будете пьяным, в то врем, как в обычные дни с двух стаканов может "повести".)
В качестве факультатива можно принять капустный, или огуречный рассол, для восстановления кислотно-щелочного баланса.
Также можно обратиться к творчеству Булгакова и поискать там рецепты, коих не мало. Но это займёт время, а тут проверенный десятилетиями рецепт, начиная с брежневских времён. При Хрущёве вообще ни капли в рот не брал!
Вот так она хранится советская граница
и никакая сволочь её не перейдёт
...
Пограничников - с праздником!
[/flood]
to be continued...