procs_windows_amd64.odin 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package runtime
  2. foreign import kernel32 "system:Kernel32.lib"
  3. windows_trap_array_bounds :: proc "contextless" () -> ! {
  4. DWORD :: u32;
  5. ULONG_PTR :: uint;
  6. EXCEPTION_ARRAY_BOUNDS_EXCEEDED :: 0xC000008C;
  7. foreign kernel32 {
  8. RaiseException :: proc "stdcall" (dwExceptionCode, dwExceptionFlags, nNumberOfArguments: DWORD, lpArguments: ^ULONG_PTR) -> ! ---
  9. }
  10. RaiseException(EXCEPTION_ARRAY_BOUNDS_EXCEEDED, 0, 0, nil);
  11. }
  12. windows_trap_type_assertion :: proc "contextless" () -> ! {
  13. windows_trap_array_bounds();
  14. }
  15. // @private
  16. // @(link_name="_tls_index")
  17. // _tls_index: u32;
  18. // @private
  19. // @(link_name="_fltused")
  20. // _fltused: i32 = 0x9875;
  21. // @(link_name="memcpy")
  22. memcpy :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
  23. foreign kernel32 {
  24. RtlCopyMemory :: proc "c" (dst, src: rawptr, len: int) ---
  25. }
  26. if dst == nil || src == nil || len == 0 {
  27. return dst;
  28. }
  29. RtlCopyMemory(dst, src, len);
  30. return dst;
  31. }
  32. // @(link_name="memmove")
  33. memmove :: proc "c" (dst, src: rawptr, len: int) -> rawptr {
  34. foreign kernel32 {
  35. RtlMoveMemory :: proc "c" (dst, src: rawptr, len: int) ---
  36. }
  37. if dst == nil || src == nil || len == 0 {
  38. return dst;
  39. }
  40. RtlMoveMemory(dst, src, len);
  41. return dst;
  42. }
  43. // @(link_name="memset")
  44. memset :: proc "c" (ptr: rawptr, val: i32, len: int) -> rawptr {
  45. if ptr == nil || len == 0 {
  46. return ptr;
  47. }
  48. b := byte(val);
  49. p_start := uintptr(ptr);
  50. p_end := p_start + uintptr(max(len, 0));
  51. for p := p_start; p < p_end; p += 1 {
  52. (^byte)(p)^ = b;
  53. }
  54. return ptr;
  55. }
  56. // @(link_name="memcmp")
  57. // memcmp :: proc "c" (dst, src: rawptr, len: int) -> i32 {
  58. // if dst == nil || src == nil {
  59. // return 0;
  60. // }
  61. // if dst == src {
  62. // return 0;
  63. // }
  64. // d, s := uintptr(dst), uintptr(src);
  65. // n := uintptr(len);
  66. // for i := uintptr(0); i < n; i += 1 {
  67. // x, y := (^byte)(d+i)^, (^byte)(s+i)^;
  68. // if x != y {
  69. // return x < y ? -1 : +1;
  70. // }
  71. // }
  72. // return 0;
  73. // }