코드 버퍼를 작성하고 디스크에 직접 쓰기 수정하는 방법 :(의 WriteFile에게)
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
HANDLE creatFile(void);
long WriteBuffer(HANDLE);
char * GetBuffer(void);
void main(void)
{
HANDLE hFile;
printf("CreateFile: ");
hFile = creatFile();
if(hFile != NULL)
{
WriteBuffer(hFile);
FlushFileBuffers(hFile);
}
CloseHandle(hFile);
printf("\n\rDone");
getchar();
}
HANDLE creatFile(void)
{
HANDLE hFile;
LPCWSTR sFileName = L"\\\\.\\E:";
DWORD dwDesiredAccess = GENERIC_WRITE;
DWORD fShareMode = FILE_SHARE_WRITE | FILE_SHARE_WRITE;
DWORD fCreationDisposition = OPEN_EXISTING;
DWORD fFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
hFile = CreateFile(sFileName, dwDesiredAccess,fShareMode,
NULL, fCreationDisposition, fFlagsAndAttributes,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
hFile = NULL;
printf("INVALID_HANDLE_VALUE: ");
switch (GetLastError())
{
case 5:
printf("\n\r Administrative Account required to run this program\n\r");
break;
case 87:
printf("\n\r Invalid Parameter in CreateFile Call \n\r");
break;
default:
printf("Error %d\n",GetLastError());
break;
}
return NULL;
}
else
{
printf("Attached -> %d\n\r",hFile);
return hFile;
}
}
long WriteBuffer(HANDLE hFile)
{
char *str = GetBuffer(); // x 64 will give us 512 (sector sized buffer) ;
DWORD bytesWritten;
long totalBytesWritten = 0;
long idx = 0;
int len = strlen(str);
for(idx = 0; idx < 100000; idx ++)
{
if(WriteFile(hFile, str, 512 * sizeof(char), &bytesWritten, NULL))
{
totalBytesWritten += bytesWritten;
printf("Sectors Written : %d\r",idx+1);
}
else
{
int le = GetLastError();
printf("Last Error : %d\r",GetLastError());
break;
}
}
printf("\n\r");
printf("Bytes Written: %d\n\r", totalBytesWritten);
printf("Handle -> %d\n\r",hFile);
return totalBytesWritten;
}
char * GetBuffer(void)
{
int i = 0, idx = 0;
const char * cstr_init = "ERASED1 ";
char *buffer = (char*)malloc(512);
char word2[512];
for (idx = 0; idx < 512; idx+=8) {
for (i = 0; i < 8; i++) {
buffer[idx+i] = cstr_init[i];
if(strlen(buffer) == 512)
break;
}
}
return buffer;
}
문제점을 :
- 숯불 * GetBuffer는 16 바이트의 외부 데이터를 가지고 . WriteFile을 수정하여 버퍼가 실제로 보유하고있는 512 개의 문자 (528 대신) 만 쓰도록했습니다. 그것이 16 후 실패하지 않도록
가 어떻게의 WriteFile을 해결합니까 : -
- 서면의 16 개 섹터 이후의 WriteFile는 GetLastError = 5 (액세스 거부)
질문 실패 섹터 및 ...
GetBuffer는 실제로 528이 아닌 512 버퍼를 생성하도록 어떻게 수정합니까?
노트 응용 프로그램은 ANSI C이며, 프로그램은 관리자로 실행되고있다.
또한 512 버퍼의 끝 부분에 char 0 문자를 추가하여 513 위치에 추가하십시오. char 값을 0으로 유지하려면 버퍼 크기를 513 이상으로 늘리십시오. 문자열) 문자 (GetBuffer) – Grantly
사용되는 유일한 int 값은 최대 528입니다 (512/513이어야 함). 따라서 환경 (x64)에 관계없이 아무런 차이가 없습니다. –
WriteBuffer의 첫 번째 예제가 아닙니다. INT는 10000 ...으로 증가하고 strlen() 값을 유지하는 데 사용됩니다. 생각했던 첫 번째 예에서 이미 수정되었습니다. 환경은 아무런 문제가 없으며 컴파일러와 설정 만 중요합니다. – Grantly