@@ -4,7 +4,7 @@ use crate::alloc::{GlobalAlloc, Layout, System};
44use crate :: ffi:: c_void;
55use crate :: ptr;
66use crate :: sync:: atomic:: { AtomicPtr , Ordering } ;
7- use crate :: sys:: c;
7+ use crate :: sys:: c:: { self , windows_targets } ;
88use crate :: sys:: common:: alloc:: { realloc_fallback, MIN_ALIGN } ;
99use core:: mem:: MaybeUninit ;
1010
@@ -17,74 +17,71 @@ mod tests;
1717// Flag to indicate that the memory returned by `HeapAlloc` should be zeroed.
1818const HEAP_ZERO_MEMORY : c:: DWORD = 0x00000008 ;
1919
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 ) ;
2927
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 ) ;
4543
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 ) ;
7169
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 ) ;
8885
8986// Cached handle to the default heap of the current process.
9087// Either a non-null handle returned by `GetProcessHeap`, or null when not yet initialized or `GetProcessHeap` failed.
0 commit comments