ディスクから生のバイトを読み取り、16進数で印刷しようとしています。「ConsoleApp.exeの0x666CDF46(msvcr110d.dll)で未処理の例外:0xC0000005:アクセス違反の書き込み場所0x002EC000」が発生します。forループ内。私の推測では、TCHAR配列の最後から実行していると思いますが、その理由str
がわかりません。dwBytesRead
とdwSize
は4096です。forループは4027の場合に例外で停止し、i
4096になるはずだと思います。誰かがこれに光を当てることができますか?
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hCD, hFile;
DWORD dwBytesRead;
hFile = CreateFile (L"sector.dat",...);
hCD = CreateFile (L"\\\\.\\E:", ...);
if (hCD != INVALID_HANDLE_VALUE)
{
DISK_GEOMETRY dgCDROM;
...
LPBYTE lpSector;
DWORD dwSize = 2 * dgCDROM.BytesPerSector; // 2 sectors
lpSector = (LPBYTE) VirtualAlloc (NULL, dwSize,
MEM_COMMIT|MEM_RESERVE,
PAGE_READWRITE);
....
if (ReadFile (hCD, lpSector, dwSize, &dwBytesRead, NULL)) {
const int size = (int) dwBytesRead;
TCHAR *str = new TCHAR[size*2+1];
int i;
for (i=0; i<size;i++) {
_stprintf_s(str+2*i, (size_t) dwBytesRead, L"%02x", lpSector[i]);
}
str[2*i]=L'\0';
OutputDebugString(str);
...
}
...
}
}