2

メモリマップトファイルを次のように使用しようとしています。

hFile = ::CreateFile(State.Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
                                 0, OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN, 0);//open the file

if(hFile !=INVALID_HANDLE_VALUE){
hMap= ::CreateFileMapping(hFile, 0, PAGE_READONLY | SEC_COMMIT, 0, 0, 0);//create Mem mapping for the file in virtual memory
if( hMap!=NULL){
base = ::MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);//load the mapped file into the RAM
//start to compare some bytes (values) from mspaint.exe file in Win7
if( *((BYTE *)base + 0x1C3DF0)== 0x05 )
i++; 
if( *((BYTE *)base + 0x25250C)== 0x21 )
i++;
if( *((BYTE *)base + 0x25272A)== 0x97 )
i++;

if(i==3){
// the file is malicious
}

ファイルサイズがギガバイトになると、MapViewOfFile関数は機能しなくなり、アプリケーションがクラッシュします。使用に制限はありますMapViewOfFileか?なにか提案を?

4

3 に答える 3

4

戻り値を確認する必要があります!クラッシュのその他の理由は、MSDNのMapViewOfFile注釈セクションにあります。

EXCEPTION_IN_PAGE_ERROR例外を防ぐには、構造化例外処理を使用して、ページファイル以外のファイルのメモリマップビューに書き込みまたは読み取りを行うコードを保護します。

他の制限がある限り、明らかに、ビューはプロセスの仮想メモリスペースに収まる必要があり、32ビットプロセスは通常、合計で2GBしかありません。ギガバイトサイズのファイルを使用している場合は、ファイル全体ではなく、小さいビューを一度にマップする必要があります...

于 2011-11-06T07:11:28.313 に答える
3

エラーをチェックしていないため、アプリケーションがクラッシュしMapViewOfFileています。失敗した場合、関数は0を返します。

制限については、関数は仮想メモリ空​​間の最大の連続した空きブロックよりも大きいブロックをマップできません。プログラムが32ビットの場合、使用可能な仮想メモリは約2GBしかありません。プログラムバイナリ、DLL、メインスレッドスタック、およびヒープがメモリスペース全体のさまざまな場所に割り当てられるため、最大の連続する空きブロックは小さくなります。

于 2011-11-06T07:07:19.263 に答える
2

ファイル全体を一度にメモリにマップしようとしています。それを行うのに十分な仮想メモリがありません。実際に必要な部分だけをマップします。そのため、CreateFileMapping()とMapViewOfFile()を使用すると、マッピングのサイズとオフセットを指定できます。私はMMFを使用してマルチGBファイルにアクセスします。マッピングのサイズを最小限に抑える必要があります。ビューを必要な場所にスライドさせるだけです。

于 2011-11-06T07:13:03.003 に答える