sanitizer_win.cc revision a25b3463477d2a825df4f656001fc07c594b35ac
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 22230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovint GetPid() { 23230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov return GetProcessId(GetCurrentProcess()); 24230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 25230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 26a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonovvoid *MmapOrDie(uptr size, const char *mem_type) { 27230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov void *rv = VirtualAlloc(0, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); 28a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov if (rv == 0) { 29a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov Report("ERROR: Failed to allocate 0x%zx (%zd) bytes of %s\n", 30a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov size, size, mem_type); 31a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov CHECK("unable to mmap" && 0); 32a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov } 33230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov return rv; 34230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 35230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 36230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonovvoid UnmapOrDie(void *addr, uptr size) { 378c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov if (VirtualFree(addr, size, MEM_DECOMMIT) == 0) { 38a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov Report("ERROR: Failed to deallocate 0x%zx (%zd) bytes at address %p\n", 39a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov size, size, addr); 40a25b3463477d2a825df4f656001fc07c594b35acAlexey Samsonov CHECK("unable to unmap" && 0); 418c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov } 42230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov} 43230c3be6cdd094a187f48e27ba0961dbeee70344Alexey Samsonov 44c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovvoid *internal_mmap(void *addr, uptr length, int prot, int flags, 45c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov int fd, u64 offset) { 468c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 47c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} 48c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 491f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_munmap(void *addr, uptr length) { 508c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 511f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov} 521f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov 53a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovint internal_close(fd_t fd) { 548c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 55a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 56a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 57c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonovfd_t internal_open(const char *filename, bool write) { 588c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 59c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} 60c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 61a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_read(fd_t fd, void *buf, uptr count) { 628c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 63a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 64a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 65a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonovuptr internal_write(fd_t fd, const void *buf, uptr count) { 668c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov if (fd != 2) 678c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 68a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov HANDLE err = GetStdHandle(STD_ERROR_HANDLE); 69a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov if (err == 0) 70a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return 0; // FIXME: this might not work on some apps. 71a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov DWORD ret; 72a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov if (!WriteFile(err, buf, count, &ret, 0)) 73a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return 0; 74a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov return ret; 75a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov} 76a56aefd2e01940fcf88d1426f9de3d5e4b1ee203Alexey Samsonov 778e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovuptr internal_filesize(fd_t fd) { 788c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 798e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov} 808e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov 818e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonovint internal_dup2(int oldfd, int newfd) { 828c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 838e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov} 848e820fcf7aafeb8101322182d742fcf99255d972Alexey Samsonov 851f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonovint internal_sscanf(const char *str, const char *format, ...) { 868c53e54ef9e713953ec9495e82e5c330b96e49f3Alexey Samsonov UNIMPLEMENTED(); 871f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov} 881f11d31faa5ed89b74f7d543b1182fe8de198be5Alexey Samsonov 89c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov} // namespace __sanitizer 90c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov 91c5d465136b911bf925f2a631e2b79f1c03e8a1b0Alexey Samsonov#endif // _WIN32 92