0

ディスクから生のバイトを読み取り、16進数で印刷しようとしています。「ConsoleApp.exeの0x666CDF46(msvcr110d.dll)で未処理の例外:0xC0000005:アクセス違反の書き込み場所0x002EC000」が発生します。forループ内。私の推測では、TCHAR配列の最後から実行していると思いますが、その理由strがわかりません。dwBytesReaddwSizeは4096です。forループは4027の場合に例外で停止し、i4096になるはずだと思います。誰かがこれに光を当てることができますか?

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);
            ...
        }

        ...
    }
}
4

1 に答える 1

3

dwBytesRead呼び出し内での使用は_stprintf_s無効です。ループの反復ごと_stprintf_sの宛先バッファーのサイズは、の特定のポイントから始まり、文字に拡張されることを示しています。これは、特にループイテレータがバッファの最後に到達する場合には当てはまりません。strdwBytesReadi

これは次のように修正できます。

            _stprintf_s(str+2*i, (size*2+1) - (2*i), L"%02x", lpSector[i]);

問題の根本が実際に何であるかが不明であるため、これで実際に問題が解決するかどうかを判断するのは難しいです。

于 2012-12-26T00:36:20.963 に答える