Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Вниз

Доступ к файлам системным файлам 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.034 c
2-1143750221
serko
2006-03-31 00:23
2006.04.16
Второй экземпляр проги!


2-1142760047
align
2006-03-19 12:20
2006.04.16
AdvStringGrid


4-1138548892
Pit
2006-01-29 18:34
2006.04.16
Подскажите почему возвращает путь только собственного приложения?


11-1124466537
L505
2005-08-19 19:48
2006.04.16
Delete key for edit box


15-1143130099
Pazitron_Brain
2006-03-23 19:08
2006.04.16
Идеальная субкультура.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский