Описания функций и структур




 

GetDriveType

Функция GetDriveType определяет, является ли диск сменным (removable), постоянным (fixed), CD-ROM, виртуальным (RAM disk), или сетевым (network drive).

UINT GetDriveType(

LPCTSTR lpRootPathName // корневой каталог диска

);

Параметры

lpRootPathName

[in] Указатель на a null-terminated-строку, которая задает корневой каталог диска, про который требуется информация. Завершающий слеш обязателен. Если lpRootPathName равен NULL, функция использует корневой каталог текущего каталога.

Возвращаемые значения

Возвращаемое значение определяет тип диска. Это может быть одно из следующих значений:

 

Значение Смысл
DRIVE_UNKNOWN Тип диска не может быть определен
DRIVE_NO_ROOT_DIR Путь к корневому каталогу неверен
DRIVE_REMOVABLE Сменный диск (FDD)
DRIVE_FIXED Постоянный диск (HDD)
DRIVE_REMOTE Удаленный (сетевой) диск
DRIVE_CDROM CD-ROM
DRIVE_RAMDISK Виртуальный диск (RAM disk)

Требования

Windows NT/2000/XP: Требует Windows NT 3.1 или более позднюю версию.
Windows 95/98/Me: Требует Windows 95 или более позднюю версию.
Header: Объявлено в winbase.h; включается в windows.h.
Library: Kernel32.lib.
Unicode: Реализовано в Unicode- и ANSI-вариантах в Windows NT/2000/XP.

CreateFile

Функция CreateFile является очень универсальной функцией и имеет множество различных применений. Поэтому далее будет описано только применение этой функции для организации прямого доступа к диску (в ОС семейства Windows NT).

HANDLE CreateFile(

LPCTSTR lpFileName, // имя диска в формате «\\.\A:»

DWORD dwDesiredAccess, // режим доступа

DWORD dwShareMode, // режим общего доступа

LPSECURITY_ATTRIBUTES lpSecurityAttributes, // атрибуты безопасности

DWORD dwCreationDisposition, // как создать файл

DWORD dwFlagsAndAttributes, // атрибуты файла

HANDLE hTemplateFile // хендл файла-шаблона

);

Образец вызова

HANDLE hDevice = CreateFile (“\\\\.\\a:”, // имя диска

GENERIC_READ, // доступ для чтения

FILE_SHARE_READ, // разделение ресурсов

NULL, // атрибуты безопасности отсутствуют

OPEN_EXISTING, // открыть существующий файл

0, // атрибуты отсутствуют

NULL); // шаблон отсутствует

Возвращаемые значения

Если функция выполнилась успешно, возвращается хендл открытого файла-диска.

Если функция выполнилась неуспешно, возвращается INVALID_HANDLE_VALUE. Для получения более подробной информации об ошибке используйте GetLastError.

SetFilePointer

Функция SetFilePointer перемещает указатель в открытом файле. Эта функция хранит указатель файла в виде двух значений типа DWORD.

DWORD SetFilePointer(

HANDLE hFile, // хендл файла

LONG lDistanceToMove, // на сколько переместить указатель

PLONG lpDistanceToMoveHigh, // -//- (старший DWORD)

DWORD dwMoveMethod // точка отсчета

);

Параметры

hFile

[in] Хендл файла, указатель которого перемещается. Хендл должен быть создан с правами доступа к файлу GENERIC_READ или GENERIC_WRITE.

lDistanceToMove

[in] Младшее двойное слово знаковой (signed) величины, определяющей количество байт, на которое надо переместить указатель файла. Если lpDistanceToMoveHigh не равно NULL, lpDistanceToMoveHigh и lDistanceToMove образуют единое 64-битное знаковое смещение указателя. Если lpDistanceToMoveHigh равно NULL, lDistanceToMove является 32-битным знаковым значением. Положительное значение lDistanceToMove перемещает указатель файла вперед (к концу файла), а отрицательное значение – назад, к началу файла.

lpDistanceToMoveHigh

[in] Указатель на старшее двойное слово (32 бита) знакового 64-битного значения смещения указателя. Если старшее двойное слово не нужно, этот указатель может быть равен NULL. Если указатель не равен NULL, этот параметр получает также старший DWORD нового значения указателя файла.

Windows 95/98/ME: Если указатель lpDistanceToMoveHigh не равен NULL, он должен указывать либо на 0, либо на -1, знаковое расширение lDistanceToMove. Любые другие значения неверны.

dwMoveMethod

[in] Точка отсчета для перемещения указателя файла. Этот параметр может принимать одно из следующих значений:

 

Значение Смысл
FILE_BEGIN Точка отсчета – начало файла.
FILE_CURRENT Точка отсчета – текущее значение указателя файла.
FILE_END Точка отсчета – конец файла.

 

Возвращаемые значения

При успешном выполнении SetFilePointer и lpDistanceToMoveHigh равном NULL возвращаемое значение является младшим двойным словом нового указателя файла. Если lpDistanceToMoveHigh не равен NULL, функция возвращает младшее двойное слово нового указателя файла и помещает старшее двойное слово по адресу в lpDistanceToMoveHigh.

При неуспешном выполнении функции и lpDistanceToMoveHigh равном NULL, возвращается INVALID_SET_FILE_POINTER. Для получения дополнительной информации об ошибке используйте GetLastError.

При неуспешном выполнении функции и lpDistanceToMoveHigh не равном NULL, возвращается INVALID_SET_FILE_POINTER. Однако, поскольку константа INVALID_SET_FILE_POINTER является допустимым значением для младшего двойного слова нового указателя файла, необходимо проверять GetLastError, чтобы определить наличие ошибки. Если ошибка произошла, GetLastError вернет значение, отличное от NO_ERROR. Если новое значение указателя файла получается отрицательным, функция не выполняется, указатель не перемещается и GetLastError возвращает ERROR_NEGATIVE_SEEK.

Требования

Windows NT/2000/XP: Требует Windows NT 3.1 или более позднюю версию.
Windows 95/98/Me: Требует Windows 95 или более позднюю версию.
Header: Объявлено в winbase.h; включается в windows.h.
Library: Kernel32.lib.

 

 

ReadFile

Функция ReadFile считывает данные из файла, начиная с позиции, на которой находится указатель файла. После завершения операции чтения указатель файла перемещается на число действительно прочитанных байт, кроме случая, когда файл был открыт с атрибутом совмещения (overlapped).

 

BOOL ReadFile(

HANDLE hFile, // хендл файла

LPVOID lpBuffer, // буфер для данных

DWORD nNumberOfBytesToRead, // количество байт, которое надо прочитать

LPDWORD lpNumberOfBytesRead, // количество действительно прочитанных байт

LPOVERLAPPED lpOverlapped // буфер совмещения

);

Параметры

hFile

[in] Хендл читаемого файла. Хендл должен быть создан с правом доступа GENERIC_READ.

lpBuffer

[out] Указатель на буфер, куда помещаются прочитанные из файла данные.

nNumberOfBytesToRead

[in] Задает количество байт, которое надо прочитать из файла.

lpNumberOfBytesRead

[out] Указатель на переменную, в которую помещается количество действительно прочитанных байт. ReadFile устанавливает это значение в 0, прежде чем начинает выполнять какие-либо действия.

lpOverlapped

[in] Указатель на структуру OVERLAPPED. Эта структура необходима, если hFile был создан с флагом FILE_FLAG_OVERLAPPED. В противном случае должен быть равен NULL.

Возвращаемые значения

При успешном выполнении функции возвращается ненулевое значение.

Если функция вернула не 0, а количество прочитанных байт равно 0, значит, указатель файла был в конце файла.

При неуспешном выполнении функция возвращает 0. Для получения дополнительной информации об ошибке используйте GetLastError.

Требования

Windows NT/2000/XP: Требует Windows NT 3.1 или более позднюю версию.
Windows 95/98/Me: Требует Windows 95 или более позднюю версию.
Header: Объявлено в winbase.h; включается в windows.h.
Library: Kernel32.lib.

CloseHandle

Функция CloseHandle закрывает открытый хендл объекта

 

BOOL CloseHandle(

HANDLE hObject // хендл объекта

);

Параметры

hObject

[in/out] хендл открытого объекта.

Return Values

При успешном выполнении функция возвращает ненулевое значение.

При неуспешном выполнении функция возвращает 0. Для получения дополнительной информации об ошибке используйте GetLastError.

Требования

Windows NT/2000/XP: Требует Windows NT 3.1 или более позднюю версию.
Windows 95/98/Me: Требует Windows 95 или более позднюю версию.
Header: Объявлено в winbase.h; включается в windows.h.
Library: Kernel32.lib.

 

Текст программы

Unit1.h

//---------------------------------------------------------------------------

 

#ifndef Unit1H

#define Unit1H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ComCtrls.hpp>

#include <ImgList.hpp>

#include <malloc.h>

 

typedef struct{

unsigned char Name[8];

unsigned char Ext[3];

unsigned char Attr;

unsigned char _Reserved[10];

unsigned short Time;

unsigned short Date;

unsigned short FirstCluster;

unsigned int Size;

}DirItem;

typedef struct{

HANDLE hDrv;

unsigned int ClusterSize;

unsigned int StartOfData;

unsigned char* FAT;

}DiskParam;

 

//---------------------------------------------------------------------------

class TForm1: public TForm

{

__published: // IDE-managed Components

TTreeView *TreeView1;

TImageList *ImageList1;

void __fastcall FormCreate(TObject *Sender);

private: // User declarations

int ReadDrive(TTreeNode* drive);

int ReadDir(TTreeNode* Parent, DirItem* File, DiskParam Param);

void BuildName(char* Name, DirItem* File);

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

 

Unit1.cpp

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

 

const int SectorSize=0x200; const int DirItemSize=0x20;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::FormCreate(TObject *Sender)

{

char DrivesBuffer[1024]; //буфер дисков

int NumDrives=GetLogicalDriveStrings(1024,DrivesBuffer); //получение списка дисков

for(int i=0;i<NumDrives/4;i++)

{

DrivesBuffer[i*4+2]=0;

if(GetDriveType(&DrivesBuffer[i*4])==DRIVE_REMOVABLE) //сменные диски

{

TTreeNode *trn=TreeView1->Items->Add(0,&DrivesBuffer[i*4]); //заполнение дерева

trn->ImageIndex=1; trn->SelectedIndex=1;

if(ReadDrive(trn)) trn->HasChildren=1;

}

}

}

//---------------------------------------------------------------------------

int TForm1::ReadDrive(TTreeNode* drive)

{

int retval=0;

DiskParam Param;

AnsiString DrPath="\\\\.\\";

HANDLE hDrv=CreateFile((DrPath+drive->Text).c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,

OPEN_EXISTING,0,NULL); //открытие диска

Param.hDrv=hDrv;

if(hDrv==INVALID_HANDLE_VALUE) return 0;

unsigned char* Boot=(unsigned char*)malloc(SectorSize);

unsigned long readed;

if(!ReadFile(hDrv,Boot,SectorSize,&readed,NULL)||readed<SectorSize)

{ //чтение boot

free(Boot); CloseHandle(hDrv); return 0;

}

Param.ClusterSize=SectorSize*Boot[0xD]; //получение значений

unsigned char FATsCount=Boot[0x10];

short RootSize=*(short*)&Boot[0x11];

short SizeOfFAT=*(short*)&Boot[0x16]; //Размер FAT

free(Boot);

unsigned char* FAT=(unsigned char*)malloc(SectorSize*SizeOfFAT); Param.FAT=FAT;

if(!ReadFile(hDrv,FAT,SectorSize*SizeOfFAT,&readed,NULL)

||readed<(unsigned)SectorSize*SizeOfFAT)

{

free(Boot); free(FAT); CloseHandle(hDrv); return 0; //Чтение FAT

}

for(int i=1;i<FATsCount;i++) //Пропуск резервных FAT

SetFilePointer(hDrv,(unsigned)SectorSize*SizeOfFAT,NULL,FILE_CURRENT);

unsigned char* Root=(unsigned char*)malloc(RootSize*DirItemSize);

if(!ReadFile(hDrv,Root,RootSize*DirItemSize,&readed,NULL)

||readed<(unsigned)RootSize*DirItemSize)

{ //чтение корневого каталога

free(Boot); free(FAT); free(Root); CloseHandle(hDrv); return 0;

}

Param.StartOfData=SetFilePointer(hDrv,0,NULL,FILE_CURRENT); //кластер 2(!)

for(int i=0;i<RootSize;i++)

{

DirItem* File=(DirItem*)&Root[i*DirItemSize];

if(File->Name[0]==0) break;

if((File->Name[0]!=0xE5&&File->Name[0]!=0x2E)&&(File->Attr&FILE_ATTRIBUTE_DIRECTORY)

&&File->Attr!=0xF) //выбор подкаталогов

{

char Name[14]={0};

BuildName(Name,File);

TTreeNode *trn=TreeView1->Items->AddChild(drive,Name);

if(ReadDir(trn,File,Param))trn->HasChildren=1; //чтение подкаталога

retval=1;

}

}

free(Root);

free(FAT);

CloseHandle(hDrv);

return retval;

}

 

 

//---------------------------------------------------------------------------

 

void TForm1::BuildName(char* Name, DirItem* File)

{

strncat(Name,File->Name,8); //постройка имени

if(char* p=strstr(Name," "))*p=0;

if(File->Ext[0]!=' ')strcat(Name,".");

strncat(Name,File->Ext,3);

if(char* p=strstr(Name," "))*p=0;

}

//---------------------------------------------------------------------------

 

int TForm1::ReadDir(TTreeNode* Parent, DirItem* File, DiskParam Param)

{

int retval=0;

unsigned long readed;

unsigned char* Dir=(unsigned char*)malloc(Param.ClusterSize);

unsigned short Cluster=File->FirstCluster;

File->Name;

int i=0;

do{

SetFilePointer(Param.hDrv,Param.StartOfData+Param.ClusterSize*(Cluster-2),

NULL,FILE_BEGIN);

if(!ReadFile(Param.hDrv,Dir+Param.ClusterSize*i,Param.ClusterSize,&readed,NULL)

||readed<Param.ClusterSize) //сборка каталога

{

free(Dir); return 0;

}

if(!(Cluster%2))

{Cluster=*(unsigned short*)&Param.FAT[(Cluster*3)/2]&0x0FFF;}else

{Cluster=*(unsigned short*)&Param.FAT[(Cluster*3)/2]>>4;};

i++;

Dir=(unsigned char*)realloc(Dir,Param.ClusterSize+Param.ClusterSize*i);

}while(Cluster<0x0FF0);

DirItem* File1;

i=0;

do{

File1=(DirItem*)&Dir[i*DirItemSize];

if((File1->Name[0]!=0xE5&&File1->Name[0]!=0x2E)

&&(File1->Attr&FILE_ATTRIBUTE_DIRECTORY)&&File1->Attr!=0xF) //выбор подкаталогов

{

char Name[14]={0};

BuildName(Name,File1);

TTreeNode *trn=TreeView1->Items->AddChild(Parent,Name);

//buildnext

if(ReadDir(trn,File1,Param))trn->HasChildren=1; //чтение подкаталога

retval=1;

}

i++;

}while(File1->Name[0]!=0);

free(Dir);

return retval;

}

//---------------------------------------------------------------------------

 

 

Результаты работы

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-04-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: