리얼 모드 프로그래밍을 아는 친구들은 BIOS의 INT 13 인터럽트를 사용하여 디스크의 절대 읽기 및 쓰기를 수행할 수 있다는 것을 알고 있지만 NT 환경에서는 INT 13 인터럽트를 사용하여 하드 디스크를 직접 읽고 쓸 수 없습니다. 여기서는 CreateFile을 사용하고 경로 이름을 "//./X:"로 설정하여 논리 디스크를 열고 읽기 및 쓰기를 수행할 수 있습니다. X는 드라이브 문자입니다.
CreateFile 함수 프로토타입은 다음과 같습니다.
CreateFile(LPCTSTR lpFileName, DWord dwDesiredaccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)을 처리합니다.
lpFileName : 열려는 파일 이름
dwDesiredAccess: GENERIC_READ이면 장치에 대한 읽기 액세스가 허용됨을 의미하고, GENERIC_WRITE이면 장치에 대한 쓰기 액세스가 허용됨을 의미합니다(조합하여 사용할 수 있음). 하나의 장치에 관련된 정보를 얻을 수 있습니다.
dwShareMode: 0은 공유가 없음을 의미하며 FILE_SHARE_WRITE는 파일에 대한 공유 액세스를 허용함을 의미합니다.
lpSecurityAttributes: 파일의 보안 속성을 정의하는 SECURITY_ATTRIBUTES 구조에 대한 포인터
dwCreationDistribution: 생성 방법
dwFlagsAndAttributes: 기타 속성
hTemplateFile: 0이 아닌 경우 파일 핸들을 지정합니다. 새 파일은 이 파일의 확장된 속성을 복사합니다.
다음 예제는 Windows XP에서 컴파일되어 전달됩니다. 구현되는 기능은 C 드라이브의 부팅 섹터를 읽고 읽은 데이터를 표시하는 것입니다.
프로그램 읽기디스크;
용도
SysUtils,
윈도우;
var
Buf: 바이트 배열 [0..511] //데이터 버퍼;
ShowText, TmpStr: 문자열;
파일핸들: THandle;
ReadCount, i: 추기경;
시작하다
//디스크 열기
FileHandle := CreateFile('//./C:', GENERIC_READ, FILE_SHARE_READ 또는 FILE_SHARE_WRITE,
없음, OPEN_EXISTING, 0, 0);
FileHandle = INVALID_HANDLE_VALUE인 경우
시작하다
MessageBox(GetDesktopWindow, '디스크 열기 실패', 'ERROR', MB_OK);
종료프로세스(0);
끝;
//부팅 섹터 데이터 읽기
if ReadFile(FileHandle, Buf, 512, ReadCount, nil) then
시작하다
SetLength(ShowText, 길이(Buf) * 3);
//데이터를 문자열로 변환
for i := 낮음(Buf)에서 높음(Buf) do
시작하다
TmpStr := Format('%2.2x ', [Buf[i]]);
CopyMemory(@ShowText[i*3+1], @TmpStr[1], 3);
끝;
끝;
MessageBox(GetDesktopWindow, PChar(ShowText), '부팅 섹터', MB_OK);
CloseHandle(파일핸들);
종료프로세스(0);
끝.