Текущий архив: 2006.04.16;
Скачать: CL | DM;
ВнизДоступ к файлам системным файлам NTFS Найти похожие ветки
← →
sally (2006-01-27 14:36) [0]пытаюсь достучаться к системным файлам NTFS($LOGFILE) система ругается: отказано в доступе. Понимаю, что нужно с выдать права на доступ к этому файлу, но как это сделать???
Если возможно, киньте код плиз..
← →
Игорь Шевченко © (2006-01-27 15:13) [1]Никак
← →
NightAngel (2006-01-27 15:34) [2]> Понимаю, что нужно с выдать права на доступ к этому файлу, но как это сделать???
Вам нужны права SYSTEM, а их можно получить только из драйвера. Хотя LFS (log file service) изначально был разработан для того, чтобы предоставлять средства протоколирования и восстановления более чем одному клиенту, он используется только NTFS. Для полноценного доступа к файлу придется писать свой драйвер NTFS. Сервис файла журнала является частью NTFS и предоставляет функции для поддержки журнала изменений диска. LFS - это набор процедур режима ядра, локализованных в драйвере NTFS, который она использует для доступа к файлу журнала.
← →
Игорь Шевченко © (2006-01-27 15:46) [3]Автор книжки "Справочник по базовому API Windows" Гэри Неббет пишет, что доступ к этим (системным) файлам NTFS через файловую систему невозможен. У меня нет оснований не верить ему.
← →
ZeroDivide © (2006-01-27 15:56) [4]
> Автор книжки "Справочник по базовому API Windows" Гэри Неббет
> пишет, что доступ к этим (системным) файлам NTFS через файловую
> систему невозможен. У меня нет оснований не верить ему.
>
В Windows 95 тоже вирусов быть не может
← →
Johnmen © (2006-01-27 16:08) [5]>В Windows 95 тоже вирусов быть не может
Что такое Windows 95 ?
← →
sally (2006-01-27 16:49) [6]Странно, но к некоторым файлам он дает доступ
$mft
$mftmirr
$volume
$attrdef
$quota
← →
NightAngel (2006-01-27 18:36) [7]Не знаю, что там пишет Гэри Неббет, но я это в свое время делал, самостоятельно распарсив все файлы, т.е. открывается диск на чтение и последовательно читается загрузочный сектор, ссылка на mft и т.д. Да, и еще... Журналирование производится как в метафайл $LogFile, так и в разреженный файл tracking.log, находящийся в каталоге System Volume Information, с атрибутами "Системный" и "Скрытый".
P.S. Знать матчасть - мало, надо уметь пользоваться своими знаниями.
Удачи!
← →
Игорь Шевченко © (2006-01-28 18:31) [8]NightAngel (27.01.06 18:36) [7]
> Не знаю, что там пишет Гэри Неббет, но я это в свое время
> делал, самостоятельно распарсив все файлы, т.е. открывается
> диск на чтение и последовательно читается загрузочный сектор,
> ссылка на mft и т.д.
Именно этот способ он и описывает, как рекомендуемый. Желательно еще при этом заблокировать диск от изменений.
"Хотя специальные файлы и являются на самом деле файлами, но открыь их обычным способом (с помощью функций ZwCreateFile или ZwOpenFile) нельзя. Даже получив в ACL права администратора, доступ к ним оказывается невозможным, поскольку для них драйвер файловой системы ntfs.sys возвращает статус STATUS_ACCESS_DENIED. В ntfs.sys существуют две переменные NtfsProtectSystemFiles и NtfsProtectSystemAttributes. По умолчанию значением обоих переменных является TRUE.
....
Кроме того, эти файлы не способны обрабатывать запрос IRP_MJ_READ, возникающего при обращении к фунцкии ZwReadFile, и если такой запрос поступит, система даст сбой."
(c) Гэри Неббет
← →
kaZaNoVa © (2006-01-28 19:10) [9]можно попробовать получить доступ к ним из другой ОС .. (например из ДОСа - NTFS for dos) но нет уверенности, что это сработает
← →
Bobby (2006-01-30 10:47) [10]Вот код с wasm.ru
Проверено, работает. Читает прямо с устройства. Попробуй заменить
lstrcat(Name, "\\config\\SAM");
на то, что тебе надо
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <winioctl.h>
ULONGLONG *GetFileClusters(
PCHAR lpFileName,
ULONG ClusterSize,
ULONG *ClCount,
ULONG *FileSize
)
{
HANDLE hFile;
ULONG OutSize;
ULONG Bytes, Cls, CnCount, r;
ULONGLONG *Clusters = NULL;
BOOLEAN Result = FALSE;
LARGE_INTEGER PrevVCN, Lcn;
STARTING_VCN_INPUT_BUFFER InBuf;
PRETRIEVAL_POINTERS_BUFFER OutBuf;
hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, OPEN_EXISTING, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
*FileSize = GetFileSize(hFile, NULL);
OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER) + (*FileSize / ClusterSize) * sizeof(OutBuf->Extents);
OutBuf = malloc(OutSize);
InBuf.StartingVcn.QuadPart = 0;
if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,
sizeof(InBuf), OutBuf, OutSize, &Bytes, NULL))
{
*ClCount = (*FileSize + ClusterSize - 1) / ClusterSize;
Clusters = malloc(*ClCount * sizeof(ULONGLONG));
PrevVCN = OutBuf->StartingVcn;
for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++)
{
Lcn = OutBuf->Extents[r].Lcn;
for (CnCount = (ULONG)(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart);
CnCount; CnCount--, Cls++, Lcn.QuadPart++) Clusters[Cls] = Lcn.QuadPart;
PrevVCN = OutBuf->Extents[r].NextVcn;
}
}
free(OutBuf);
CloseHandle(hFile);
}
return Clusters;
}
void FileCopy(
PCHAR lpSrcName,
PCHAR lpDstName
)
{
ULONG ClusterSize, BlockSize;
ULONGLONG *Clusters;
ULONG ClCount, FileSize, Bytes;
HANDLE hDrive, hFile;
ULONG SecPerCl, BtPerSec, r;
PVOID Buff;
LARGE_INTEGER Offset;
CHAR Name[7];
Name[0] = lpSrcName[0];
Name[1] = ":";
Name[2] = 0;
GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL);
ClusterSize = SecPerCl * BtPerSec;
Clusters = GetFileClusters(lpSrcName, ClusterSize, &ClCount, &FileSize);
if (Clusters)
{
Name[0] = "\\";
Name[1] = "\\";
Name[2] = ".";
Name[3] = "\\";
Name[4] = lpSrcName[0];
Name[5] = ":";
Name[6] = 0;
hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if (hDrive != INVALID_HANDLE_VALUE)
{
hFile = CreateFile(lpDstName, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
Buff = malloc(ClusterSize);
for (r = 0; r < ClCount; r++, FileSize -= BlockSize)
{
Offset.QuadPart = ClusterSize * Clusters[r];
SetFilePointer(hDrive, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);
ReadFile(hDrive, Buff, ClusterSize, &Bytes, NULL);
BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;
WriteFile(hFile, Buff, BlockSize, &Bytes, NULL);
}
free(Buff);
CloseHandle(hFile);
}
CloseHandle(hDrive);
}
free(Clusters);
}
}
int main(int argc, char *argv[])
{
CHAR Name[MAX_PATH];
GetSystemDirectory(Name, MAX_PATH);
lstrcat(Name, "\\config\\SAM");
if (argc > 1)
{
FileCopy(Name, argv[1]);
}
return 0;
}
← →
kaZaNoVa © (2006-01-30 10:54) [11]Bobby (30.01.06 10:47) [10]
а на делфи аналог есть такого?
← →
Bobby (2006-01-30 10:56) [12]Нет, к сожалению
← →
Чапаев © (2006-01-30 18:13) [13]
> Автор книжки "Справочник по базовому API Windows" Гэри Неббет
> пишет, что доступ к этим (системным) файлам NTFS через файловую
> систему невозможен. У меня нет оснований не верить ему.
В командной строке введи: type c:\$Volume. Комментарии излишни. ;-)
← →
Игорь Шевченко © (2006-01-31 10:49) [14]
> В командной строке введи: type c:\$Volume. Комментарии излишни.
> ;-)
или type c:\$mft ?
← →
kaZaNoVa © (2006-01-31 11:03) [15]Чапаев © (30.01.06 18:13) [13]
> В командной строке введи: type c:\$Volume. Комментарии
> излишни. ;-)
у меня пишет:
Microsoft Windows [Версия 5.2.3790]
(С) Корпорация Майкрософт, 1985-2003.
E:\>type c:\$Volume
Не удается найти указанный файл.
Страницы: 1 вся ветка
Текущий архив: 2006.04.16;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.078 c