patche 6.1.459
IsBadReadPtr という API でポインタが指すメモリを読めるか判定できるらしい。
libcall で DLL から返されたポインタが有効かどうか判定するために使われている。
+ /* + * Check if a pointer points to a valid NUL terminated string. + * Return the length of the string, including terminating NUL. + * Returns 0 for an invalid pointer, 1 for an empty string. + */ + static size_t + check_str_len(char_u *str) + { + SYSTEM_INFO si; + MEMORY_BASIC_INFORMATION mbi; + size_t length = 0; + size_t i; + const char *p; + + /* get page size */ + GetSystemInfo(&si); + + /* get memory information */ + if (VirtualQuery(str, &mbi, sizeof(mbi))) + { + /* pre cast these (typing savers) */ + DWORD dwStr = (DWORD)str; + DWORD dwBaseAddress = (DWORD)mbi.BaseAddress; + + /* get start address of page that str is on */ + DWORD strPage = dwStr - (dwStr - dwBaseAddress) % si.dwPageSize; + + /* get length from str to end of page */ + DWORD pageLength = si.dwPageSize - (dwStr - strPage); + + for (p = str; !IsBadReadPtr(p, pageLength); + p += pageLength, pageLength = si.dwPageSize) + for (i = 0; i < pageLength; ++i, ++length) + if (p[i] == NUL) + return length + 1; + } + + return 0; + }
IsBadReadPtr
呼び出し側プロセスが、指定されたメモリブロックに対して読み取りアクセスを行えるかどうかを判断します。
VirtualQuery
呼び出し側のプロセスの仮想アドレス空間にある範囲のページに関する情報を取得します。
ほかのプロセスのアドレス空間にある範囲のページに関する情報を取得するには、VirtualQueryEx 関数を使います。