Rollup merge of #127370 - ChrisDenton:win-sys, r=Mark-Simulacrum · model-checking/verify-rust-std@3ad2560 (original) (raw)

`@@ -4,7 +4,7 @@ use crate::alloc::{GlobalAlloc, Layout, System};

`

4

4

`use crate::ffi::c_void;

`

5

5

`use crate::ptr;

`

6

6

`use crate::sync::atomic::{AtomicPtr, Ordering};

`

7

``

`-

use crate::sys::c;

`

``

7

`+

use crate::sys::c::{self, windows_targets};

`

8

8

`use crate::sys::common::alloc::{realloc_fallback, MIN_ALIGN};

`

9

9

`use core::mem::MaybeUninit;

`

10

10

``

`@@ -17,74 +17,71 @@ mod tests;

`

17

17

`` // Flag to indicate that the memory returned by HeapAlloc should be zeroed.

``

18

18

`const HEAP_ZERO_MEMORY: c::DWORD = 0x00000008;

`

19

19

``

20

``

`-

#[link(name = "kernel32")]

`

21

``

`-

extern "system" {

`

22

``

`-

// Get a handle to the default heap of the current process, or null if the operation fails.

`

23

``

`-

//

`

24

``

`-

// SAFETY: Successful calls to this function within the same process are assumed to

`

25

``

`-

// always return the same handle, which remains valid for the entire lifetime of the process.

`

26

``

`-

//

`

27

``

`-

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-getprocessheap

`

28

``

`-

fn GetProcessHeap() -> c::HANDLE;

`

``

20

`+

// Get a handle to the default heap of the current process, or null if the operation fails.

`

``

21

`+

//

`

``

22

`+

// SAFETY: Successful calls to this function within the same process are assumed to

`

``

23

`+

// always return the same handle, which remains valid for the entire lifetime of the process.

`

``

24

`+

//

`

``

25

`+

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-getprocessheap

`

``

26

`+

windows_targets::link!("kernel32.dll" "system" fn GetProcessHeap() -> c::HANDLE);

`

29

27

``

30

``

`` -

// Allocate a block of dwBytes bytes of memory from a given heap hHeap.

``

31

``

`` -

// The allocated memory may be uninitialized, or zeroed if dwFlags is

``

32

``

`` -

// set to HEAP_ZERO_MEMORY.

``

33

``

`-

//

`

34

``

`-

// Returns a pointer to the newly-allocated memory or null if the operation fails.

`

35

``

`` -

// The returned pointer will be aligned to at least MIN_ALIGN.

``

36

``

`-

//

`

37

``

`-

// SAFETY:

`

38

``

`` -

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

39

``

`` -

// - dwFlags must be set to either zero or HEAP_ZERO_MEMORY.

``

40

``

`-

//

`

41

``

`` -

// Note that dwBytes is allowed to be zero, contrary to some other allocators.

``

42

``

`-

//

`

43

``

`-

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heapalloc

`

44

``

`-

fn HeapAlloc(hHeap: c::HANDLE, dwFlags: c::DWORD, dwBytes: c::SIZE_T) -> c::LPVOID;

`

``

28

`` +

// Allocate a block of dwBytes bytes of memory from a given heap hHeap.

``

``

29

`` +

// The allocated memory may be uninitialized, or zeroed if dwFlags is

``

``

30

`` +

// set to HEAP_ZERO_MEMORY.

``

``

31

`+

//

`

``

32

`+

// Returns a pointer to the newly-allocated memory or null if the operation fails.

`

``

33

`` +

// The returned pointer will be aligned to at least MIN_ALIGN.

``

``

34

`+

//

`

``

35

`+

// SAFETY:

`

``

36

`` +

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

``

37

`` +

// - dwFlags must be set to either zero or HEAP_ZERO_MEMORY.

``

``

38

`+

//

`

``

39

`` +

// Note that dwBytes is allowed to be zero, contrary to some other allocators.

``

``

40

`+

//

`

``

41

`+

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heapalloc

`

``

42

`+

windows_targets::link!("kernel32.dll" "system" fn HeapAlloc(hheap: c::HANDLE, dwflags: u32, dwbytes: usize) -> *mut core::ffi::c_void);

`

45

43

``

46

``

`` -

// Reallocate a block of memory behind a given pointer lpMem from a given heap hHeap,

``

47

``

`` -

// to a block of at least dwBytes bytes, either shrinking the block in place,

``

48

``

`-

// or allocating at a new location, copying memory, and freeing the original location.

`

49

``

`-

//

`

50

``

`-

// Returns a pointer to the reallocated memory or null if the operation fails.

`

51

``

`` -

// The returned pointer will be aligned to at least MIN_ALIGN.

``

52

``

`-

// If the operation fails the given block will never have been freed.

`

53

``

`-

//

`

54

``

`-

// SAFETY:

`

55

``

`` -

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

56

``

`` -

// - dwFlags must be set to zero.

``

57

``

`` -

// - lpMem must be a non-null pointer to an allocated block returned by HeapAlloc or

``

58

``

`` -

// HeapReAlloc, that has not already been freed.

``

59

``

`-

// If the block was successfully reallocated at a new location, pointers pointing to

`

60

``

`` -

// the freed memory, such as lpMem, must not be dereferenced ever again.

``

61

``

`-

//

`

62

``

`` -

// Note that dwBytes is allowed to be zero, contrary to some other allocators.

``

63

``

`-

//

`

64

``

`-

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heaprealloc

`

65

``

`-

fn HeapReAlloc(

`

66

``

`-

hHeap: c::HANDLE,

`

67

``

`-

dwFlags: c::DWORD,

`

68

``

`-

lpMem: c::LPVOID,

`

69

``

`-

dwBytes: c::SIZE_T,

`

70

``

`-

) -> c::LPVOID;

`

``

44

`` +

// Reallocate a block of memory behind a given pointer lpMem from a given heap hHeap,

``

``

45

`` +

// to a block of at least dwBytes bytes, either shrinking the block in place,

``

``

46

`+

// or allocating at a new location, copying memory, and freeing the original location.

`

``

47

`+

//

`

``

48

`+

// Returns a pointer to the reallocated memory or null if the operation fails.

`

``

49

`` +

// The returned pointer will be aligned to at least MIN_ALIGN.

``

``

50

`+

// If the operation fails the given block will never have been freed.

`

``

51

`+

//

`

``

52

`+

// SAFETY:

`

``

53

`` +

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

``

54

`` +

// - dwFlags must be set to zero.

``

``

55

`` +

// - lpMem must be a non-null pointer to an allocated block returned by HeapAlloc or

``

``

56

`` +

// HeapReAlloc, that has not already been freed.

``

``

57

`+

// If the block was successfully reallocated at a new location, pointers pointing to

`

``

58

`` +

// the freed memory, such as lpMem, must not be dereferenced ever again.

``

``

59

`+

//

`

``

60

`` +

// Note that dwBytes is allowed to be zero, contrary to some other allocators.

``

``

61

`+

//

`

``

62

`+

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heaprealloc

`

``

63

`+

windows_targets::link!("kernel32.dll" "system" fn HeapReAlloc(

`

``

64

`+

hheap: c::HANDLE,

`

``

65

`+

dwflags : u32,

`

``

66

`+

lpmem: *const core::ffi::c_void,

`

``

67

`+

dwbytes: usize

`

``

68

`+

) -> *mut core::ffi::c_void);

`

71

69

``

72

``

`` -

// Free a block of memory behind a given pointer lpMem from a given heap hHeap.

``

73

``

`-

// Returns a nonzero value if the operation is successful, and zero if the operation fails.

`

74

``

`-

//

`

75

``

`-

// SAFETY:

`

76

``

`` -

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

77

``

`` -

// - dwFlags must be set to zero.

``

78

``

`` -

// - lpMem must be a pointer to an allocated block returned by HeapAlloc or HeapReAlloc,

``

79

``

`-

// that has not already been freed.

`

80

``

`` -

// If the block was successfully freed, pointers pointing to the freed memory, such as lpMem,

``

81

``

`-

// must not be dereferenced ever again.

`

82

``

`-

//

`

83

``

`` -

// Note that lpMem is allowed to be null, which will not cause the operation to fail.

``

84

``

`-

//

`

85

``

`-

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heapfree

`

86

``

`-

fn HeapFree(hHeap: c::HANDLE, dwFlags: c::DWORD, lpMem: c::LPVOID) -> c::BOOL;

`

87

``

`-

}

`

``

70

`` +

// Free a block of memory behind a given pointer lpMem from a given heap hHeap.

``

``

71

`+

// Returns a nonzero value if the operation is successful, and zero if the operation fails.

`

``

72

`+

//

`

``

73

`+

// SAFETY:

`

``

74

`` +

// - hHeap must be a non-null handle returned by GetProcessHeap.

``

``

75

`` +

// - dwFlags must be set to zero.

``

``

76

`` +

// - lpMem must be a pointer to an allocated block returned by HeapAlloc or HeapReAlloc,

``

``

77

`+

// that has not already been freed.

`

``

78

`` +

// If the block was successfully freed, pointers pointing to the freed memory, such as lpMem,

``

``

79

`+

// must not be dereferenced ever again.

`

``

80

`+

//

`

``

81

`` +

// Note that lpMem is allowed to be null, which will not cause the operation to fail.

``

``

82

`+

//

`

``

83

`+

// See https://docs.microsoft.com/windows/win32/api/heapapi/nf-heapapi-heapfree

`

``

84

`+

windows_targets::link!("kernel32.dll" "system" fn HeapFree(hheap: c::HANDLE, dwflags: u32, lpmem: *const core::ffi::c_void) -> c::BOOL);

`

88

85

``

89

86

`// Cached handle to the default heap of the current process.

`

90

87

`` // Either a non-null handle returned by GetProcessHeap, or null when not yet initialized or GetProcessHeap failed.

``