0

MapViewOfFile の使用に少し問題があります。この関数は、マップされたビューの開始アドレスを返すので、それは一連のバイトだと思います。そして、これは私が積み上げた場所です:

INVOKE MapViewOfFile, hMapFile, FILE_MAP_READ, 0, 0, 0
mov pMemory, eax
mov edx, DWORD PTR [pMemory]

ポインターは、メモリのブロック全体をファイルに保存する際の正しい原因であり、すべて問題ありません。だから私の質問は:すべての要素(バイト)を参照する方法です。

前もって感謝します

4

1 に答える 1

0

pMemory を正しいタイプにキャストし、pMemory から pMemory + マップされたメモリのサイズ - 参照するタイプのサイズに移動します...

つまり、効果的にメモリを割り当て、メモリを変更すると変更されるファイルにメモリを関連付けました。

pMemoryCが によって返されるポインターであると仮定すると、次のようになりますMapViewOfFile

int x = (*(int *)pMemory);   // Read the first int
char c = (*(char *)pMemory);   // Read the first char
typedef struct oddball { int x, int y, int z, char str[256] } oddball; // assume the typedef syntax is right...
oddball *p = (oddball *)pMemory;  // point to the base of the mapped memory
p += 14;  // p now points to the 15th instance of oddball in the file.
// Or... p = &p[14];
p->x = 0;
p->y = 0;
p->z = 0;
strcpy( p->str( "This is the 0, 0, 0 position" ) );
// You've now changed the memory to which p[14] refers.

// To read every byte... (Again in C, use the compiler to generate asm
// Assumes:
//     fileSize is the size of the mapped memory in bytes
//     pMemory is the pointer returned by MapViewOfFile
//     buffer is a block of memory that will hold n bytes
//     pos is the position from which you want to read
//     n is the number of bytes to read from position pos and the smallest size in bytes to which buffer can point
void readBytes( unsigned int fileSize, char *pMemory, char *buffer, unsigned int n, unsigned int pos )
{
    char *endP = pMemory + fileSize;
    char *start = pMemory + pos;
    char *end = start + n;
    int i = 0;

    // Code to stay within your memory boundaries
    if( end > endP )
    {
        n -= (end - endP);  // This might be wrong...
        end = endP;
    }

    if( end < start )
        return;
    // end boundary check

    for( ; start < end; start++, i++ )
    {
        buffer[i] = *start;
    }
}

-O2 を使用してコンパイラによって上記のコードから生成された asm コードを次に示します。

        .686P
        .XMM
        .model  flat

PUBLIC  _readBytes
_TEXT   SEGMENT
_fileSize$ = 8                  ; size = 4
_pMemory$ = 12                  ; size = 4
_buffer$ = 16                   ; size = 4
_n$ = 20                        ; size = 4
_pos$ = 24                      ; size = 4
_readBytes PROC                 ; COMDAT
    mov eax, DWORD PTR _pMemory$[esp-4]
    mov edx, DWORD PTR _fileSize$[esp-4]

    mov ecx, DWORD PTR _n$[esp-4]
    add edx, eax
    add eax, DWORD PTR _pos$[esp-4]
    add ecx, eax

    cmp ecx, edx
    jbe SHORT $LN5@readBytes

    mov ecx, edx
$LN5@readBytes:
    cmp eax, ecx
    jae SHORT $LN1@readBytes
    push    esi
    mov esi, DWORD PTR _buffer$[esp]
    sub esi, eax
$LL3@readBytes:
    mov dl, BYTE PTR [eax]
    mov BYTE PTR [esi+eax], dl
    inc eax
    cmp eax, ecx
    jb  SHORT $LL3@readBytes
    pop esi
$LN1@readBytes:
    ret 0
_readBytes ENDP
_TEXT   ENDS
END
于 2012-08-16T06:42:29.367 に答える