汇编程序+ WinApi MapViewOfFile

时间:2012-08-16 03:22:26

标签: winapi assembly masm

使用MapViewOfFile时遇到了一些问题。此函数返回映射视图的起始地址,因此我认为它是一个字节序列。这就是我堆积的地方:

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

指针是正确的,因为在将整个内存块保存到文件期间,一切都很好。所以我的问题是:如何引用每个元素(字节)。

提前致谢

1 个答案:

答案 0 :(得分: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