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 + 映射内存的大小 - 您引用的类型的大小...

换句话说,您已经有效地分配了内存并将内存与随着您更改内存而更改的文件相关联。

C假设 pMemory 是由返回的指针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 回答