mmio_file_t * mmio_file_read(const char *filename) { HANDLE ffm, fd; WCHAR *wfilename; void *rv; int len; len = mbstowcs(NULL, filename, 0) + 1; wfilename = malloc(len * sizeof(WCHAR)); mbstowcs(wfilename, filename, len); if ((ffm = CreateFileForMappingW(wfilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) == INVALID_HANDLE_VALUE) { E_ERROR("Failed to create mapping for the file '%s': %08x\n", filename, GetLastError()); return NULL; } if ((fd = CreateFileMappingW(ffm, NULL, PAGE_READONLY, 0, 0, NULL)) == NULL) { E_ERROR("Failed to CreateFileMapping: %08x\n", GetLastError()); CloseHandle(ffm); return NULL; } rv = MapViewOfFile(fd, FILE_MAP_READ, 0, 0, 0); free(wfilename); CloseHandle(ffm); CloseHandle(fd); return (mmio_file_t *) rv; }
HANDLE XCEAPI XCECreateFileForMappingW( LPCWSTR wfname, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { HANDLE hFile; wchar_t wpath[MAX_PATH]; wchar_t *p; DWORD dwError = 0; XCEFixPathW(wfname, wpath); SetLastError(0); hFile = CreateFileForMappingW(wpath, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); if(hFile == INVALID_HANDLE_VALUE) { dwError = GetLastError(); XCEShowMessageA("CreateFileForMapping: %d", dwError); errno = _winerror2errno(dwError); } return hFile; }
static HANDLE open_exe_file (LPCWSTR name, struct binary_info *binary_info) { HANDLE handle; handle = CreateFileForMappingW( name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); if (handle != INVALID_HANDLE_VALUE) MODULE_get_binary_info( handle, binary_info ); return handle; }