sanitizer_win.cc revision ed996f79710f532bf231537e44d5c8c9c9d57e8d
17f9c5a220b2768a450696bbd157a0e6f2e9ceea3Alexey Samsonov//===-- sanitizer_win.cc --------------------------------------------------===// 2c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// 3c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// The LLVM Compiler Infrastructure 4c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// 5c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is distributed under the University of Illinois Open Source 6c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// License. See LICENSE.TXT for details. 7c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// 8c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===// 9c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// 10c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// This file is shared between AddressSanitizer and ThreadSanitizer 11c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// run-time libraries and implements windows-specific functions from 12c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov// sanitizer_libc.h. 13c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov//===----------------------------------------------------------------------===// 14c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#ifdef _WIN32 15c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include <windows.h> 16c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 179929ffd1c4737d2c50829dcefcb0b8f1926a05ffAlexey Samsonov#include "sanitizer_common.h" 18c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#include "sanitizer_libc.h" 19c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 20c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovnamespace __sanitizer { 21c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 22e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov// --------------------- sanitizer_common.h 23230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovint GetPid() { 24230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov return GetProcessId(GetCurrentProcess()); 25230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 26230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 27ed996f79710f532bf231537e44d5c8c9c9d57e8dAlexey Samsonovvoid GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top, 28e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov uptr *stack_bottom) { 29e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov CHECK(stack_top); 30e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov CHECK(stack_bottom); 31e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov MEMORY_BASIC_INFORMATION mbi; 32e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov CHECK(VirtualQuery(&mbi /* on stack */, &mbi, sizeof(mbi)) != 0); 33e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov // FIXME: is it possible for the stack to not be a single allocation? 34e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov // Are these values what ASan expects to get (reserved, not committed; 35e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov // including stack guard page) ? 36e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov *stack_top = (uptr)mbi.BaseAddress + mbi.RegionSize; 37e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov *stack_bottom = (uptr)mbi.AllocationBase; 38e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov} 39e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov 40e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov 41a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonovvoid *MmapOrDie(uptr size, const char *mem_type) { 42230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov void *rv = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 43a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov if (rv == 0) { 44a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov Report("ERROR: Failed to allocate 0x%zx (%zd) bytes of %s\n", 45a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov size, size, mem_type); 46a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov CHECK("unable to mmap" && 0); 47a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov } 48230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov return rv; 49230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 50230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 51230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovvoid UnmapOrDie(void *addr, uptr size) { 528c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov if (VirtualFree(addr, size, MEM_DECOMMIT) == 0) { 53a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov Report("ERROR: Failed to deallocate 0x%zx (%zd) bytes at address %p\n", 54a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov size, size, addr); 55a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov CHECK("unable to unmap" && 0); 568c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov } 57230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 58230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 59e5931fd7d2a74fd7fb60bd8d7f644cca51a24364Alexey Samsonov// ------------------ sanitizer_libc.h 60c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovvoid *internal_mmap(void *addr, uptr length, int prot, int flags, 61c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov int fd, u64 offset) { 628c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 63c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} 64c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 651f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_munmap(void *addr, uptr length) { 668c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 671f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov} 681f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov 69a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovint internal_close(fd_t fd) { 708c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 71a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 72a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 73c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovfd_t internal_open(const char *filename, bool write) { 748c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 75c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} 76c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 77a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_read(fd_t fd, void *buf, uptr count) { 788c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 79a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 80a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 81a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_write(fd_t fd, const void *buf, uptr count) { 828c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov if (fd != 2) 838c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 84a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov HANDLE err = GetStdHandle(STD_ERROR_HANDLE); 85a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov if (err == 0) 86a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return 0; // FIXME: this might not work on some apps. 87a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov DWORD ret; 88a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov if (!WriteFile(err, buf, count, &ret, 0)) 89a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return 0; 90a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return ret; 91a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 92a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 938e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovuptr internal_filesize(fd_t fd) { 948c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 958e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov} 968e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov 978e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovint internal_dup2(int oldfd, int newfd) { 988c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 998e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov} 1008e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov 1011f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_sscanf(const char *str, const char *format, ...) { 1028c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 1031f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov} 1041f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov 105c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} // namespace __sanitizer 106c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 107c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#endif // _WIN32 108