ReactOS 0.4.15-dev-8434-g155a7c7
winternl.h File Reference
#include <ntdef.h>
#include <windef.h>
Include dependency graph for winternl.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _UNICODE_STRING
 
struct  _CLIENT_ID
 
struct  _CURDIR
 
struct  RTL_DRIVE_LETTER_CURDIR
 
struct  tagRTL_BITMAP
 
struct  _RTL_USER_PROCESS_PARAMETERS
 
struct  _PEB_LDR_DATA
 
struct  _GDI_TEB_BATCH
 
struct  _RTL_ACTIVATION_CONTEXT_STACK_FRAME
 
struct  _ACTIVATION_CONTEXT_STACK
 
struct  _TEB_ACTIVE_FRAME_CONTEXT
 
struct  _TEB_ACTIVE_FRAME
 
struct  _PEB
 
struct  _TEB
 

Macros

#define WINE_NTSTATUS_DECLARED
 
#define __UNICODE_STRING_DEFINED__
 
#define ARRAY_SIZE   ARRAYSIZE
 
#define MSVCRT_free   free
 
#define MSVCRT_malloc   malloc
 
#define MSVCRT__exit   exit
 
#define MSVCRT_abort   abort
 

Typedefs

typedef LONG NTSTATUS
 
typedef struct _UNICODE_STRING UNICODE_STRING
 
typedef struct _UNICODE_STRINGPUNICODE_STRING
 
typedef struct _CLIENT_ID CLIENT_ID
 
typedef struct _CLIENT_IDPCLIENT_ID
 
typedef struct _CURDIR CURDIR
 
typedef struct _CURDIRPCURDIR
 
typedef struct RTL_DRIVE_LETTER_CURDIR RTL_DRIVE_LETTER_CURDIR
 
typedef struct RTL_DRIVE_LETTER_CURDIRPRTL_DRIVE_LETTER_CURDIR
 
typedef struct tagRTL_BITMAP RTL_BITMAP
 
typedef struct tagRTL_BITMAPPRTL_BITMAP
 
typedef const RTL_BITMAPPCRTL_BITMAP
 
typedef struct _RTL_USER_PROCESS_PARAMETERS RTL_USER_PROCESS_PARAMETERS
 
typedef struct _RTL_USER_PROCESS_PARAMETERSPRTL_USER_PROCESS_PARAMETERS
 
typedef struct _PEB_LDR_DATA PEB_LDR_DATA
 
typedef struct _PEB_LDR_DATAPPEB_LDR_DATA
 
typedef struct _GDI_TEB_BATCH GDI_TEB_BATCH
 
typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME RTL_ACTIVATION_CONTEXT_STACK_FRAME
 
typedef struct _RTL_ACTIVATION_CONTEXT_STACK_FRAMEPRTL_ACTIVATION_CONTEXT_STACK_FRAME
 
typedef struct _ACTIVATION_CONTEXT_STACK ACTIVATION_CONTEXT_STACK
 
typedef struct _ACTIVATION_CONTEXT_STACKPACTIVATION_CONTEXT_STACK
 
typedef struct _TEB_ACTIVE_FRAME_CONTEXT TEB_ACTIVE_FRAME_CONTEXT
 
typedef struct _TEB_ACTIVE_FRAME_CONTEXTPTEB_ACTIVE_FRAME_CONTEXT
 
typedef struct _TEB_ACTIVE_FRAME TEB_ACTIVE_FRAME
 
typedef struct _TEB_ACTIVE_FRAMEPTEB_ACTIVE_FRAME
 
typedef struct _PEB PEB
 
typedef struct _PEBPPEB
 
typedef struct _TEB TEB
 
typedef struct _TEBPTEB
 

Functions

NTSYSAPI PVOID WINAPI RtlAllocateHeap (HANDLE, ULONG, SIZE_T) __WINE_ALLOC_SIZE(3)
 
NTSYSAPI BOOLEAN WINAPI RtlAreBitsSet (PCRTL_BITMAP, ULONG, ULONG)
 
NTSYSAPI BOOLEAN WINAPI RtlAreBitsClear (PCRTL_BITMAP, ULONG, ULONG)
 
NTSYSAPI BOOLEAN WINAPI RtlFreeHeap (HANDLE, ULONG, PVOID)
 
NTSYSAPI void WINAPI RtlInitializeBitMap (PRTL_BITMAP, PULONG, ULONG)
 
NTSYSAPI void WINAPI RtlSetBits (PRTL_BITMAP, ULONG, ULONG)
 

Macro Definition Documentation

◆ __UNICODE_STRING_DEFINED__

#define __UNICODE_STRING_DEFINED__

Definition at line 41 of file winternl.h.

◆ ARRAY_SIZE

#define ARRAY_SIZE   ARRAYSIZE

Definition at line 306 of file winternl.h.

◆ MSVCRT__exit

#define MSVCRT__exit   exit

Definition at line 310 of file winternl.h.

◆ MSVCRT_abort

#define MSVCRT_abort (   void)    abort

Definition at line 311 of file winternl.h.

◆ MSVCRT_free

#define MSVCRT_free   free

Definition at line 307 of file winternl.h.

◆ MSVCRT_malloc

#define MSVCRT_malloc   malloc

Definition at line 308 of file winternl.h.

◆ WINE_NTSTATUS_DECLARED

#define WINE_NTSTATUS_DECLARED

Definition at line 36 of file winternl.h.

Typedef Documentation

◆ ACTIVATION_CONTEXT_STACK

◆ CLIENT_ID

◆ CURDIR

◆ GDI_TEB_BATCH

◆ NTSTATUS

typedef LONG NTSTATUS

Definition at line 37 of file winternl.h.

◆ PACTIVATION_CONTEXT_STACK

◆ PCLIENT_ID

◆ PCRTL_BITMAP

Definition at line 74 of file winternl.h.

◆ PCURDIR

typedef struct _CURDIR * PCURDIR

◆ PEB

typedef struct _PEB PEB

◆ PEB_LDR_DATA

◆ PPEB

typedef struct _PEB * PPEB

◆ PPEB_LDR_DATA

◆ PRTL_ACTIVATION_CONTEXT_STACK_FRAME

◆ PRTL_BITMAP

◆ PRTL_DRIVE_LETTER_CURDIR

◆ PRTL_USER_PROCESS_PARAMETERS

◆ PTEB

typedef struct _TEB * PTEB

◆ PTEB_ACTIVE_FRAME

◆ PTEB_ACTIVE_FRAME_CONTEXT

◆ PUNICODE_STRING

◆ RTL_ACTIVATION_CONTEXT_STACK_FRAME

◆ RTL_BITMAP

◆ RTL_DRIVE_LETTER_CURDIR

◆ RTL_USER_PROCESS_PARAMETERS

◆ TEB

typedef struct _TEB TEB

◆ TEB_ACTIVE_FRAME

◆ TEB_ACTIVE_FRAME_CONTEXT

◆ UNICODE_STRING

Function Documentation

◆ RtlAllocateHeap()

NTSYSAPI PVOID WINAPI RtlAllocateHeap ( HANDLE  ,
ULONG  ,
SIZE_T   
)

◆ RtlAreBitsClear()

NTSYSAPI BOOLEAN WINAPI RtlAreBitsClear ( PCRTL_BITMAP  ,
ULONG  ,
ULONG   
)

◆ RtlAreBitsSet()

NTSYSAPI BOOLEAN WINAPI RtlAreBitsSet ( PCRTL_BITMAP  ,
ULONG  ,
ULONG   
)

◆ RtlFreeHeap()

NTSYSAPI BOOLEAN WINAPI RtlFreeHeap ( HANDLE  HeapPtr,
ULONG  Flags,
PVOID  Ptr 
)

Definition at line 2286 of file heap.c.

2291{
2292 PHEAP Heap;
2293 PHEAP_ENTRY HeapEntry;
2294 USHORT TagIndex = 0;
2295 SIZE_T BlockSize;
2296 PHEAP_VIRTUAL_ALLOC_ENTRY VirtualEntry;
2299
2300 /* Freeing NULL pointer is a legal operation */
2301 if (!Ptr) return TRUE;
2302
2303 /* Get pointer to the heap and force flags */
2304 Heap = (PHEAP)HeapPtr;
2305 Flags |= Heap->ForceFlags;
2306
2307 /* Call special heap */
2309 return RtlDebugFreeHeap(Heap, Flags, Ptr);
2310
2311 /* Get pointer to the heap entry */
2312 HeapEntry = (PHEAP_ENTRY)Ptr - 1;
2313
2314 /* Protect with SEH in case the pointer is not valid */
2315 _SEH2_TRY
2316 {
2317 /* Check this entry, fail if it's invalid */
2318 if (!(HeapEntry->Flags & HEAP_ENTRY_BUSY) ||
2319 (((ULONG_PTR)Ptr & 0x7) != 0) ||
2320 (HeapEntry->SegmentOffset >= HEAP_SEGMENTS))
2321 {
2322 /* This is an invalid block */
2323 DPRINT1("HEAP: Trying to free an invalid address %p!\n", Ptr);
2325 _SEH2_YIELD(return FALSE);
2326 }
2327 }
2329 {
2330 /* The pointer was invalid */
2331 DPRINT1("HEAP: Trying to free an invalid address %p!\n", Ptr);
2333 _SEH2_YIELD(return FALSE);
2334 }
2335 _SEH2_END;
2336
2337 /* Lock if necessary */
2338 if (!(Flags & HEAP_NO_SERIALIZE))
2339 {
2341 Locked = TRUE;
2342 }
2343
2344 if (HeapEntry->Flags & HEAP_ENTRY_VIRTUAL_ALLOC)
2345 {
2346 /* Big allocation */
2347 VirtualEntry = CONTAINING_RECORD(HeapEntry, HEAP_VIRTUAL_ALLOC_ENTRY, BusyBlock);
2348
2349 /* Remove it from the list */
2350 RemoveEntryList(&VirtualEntry->Entry);
2351
2352 // TODO: Tagging
2353
2354 BlockSize = 0;
2355 Status = ZwFreeVirtualMemory(NtCurrentProcess(),
2356 (PVOID *)&VirtualEntry,
2357 &BlockSize,
2358 MEM_RELEASE);
2359
2360 if (!NT_SUCCESS(Status))
2361 {
2362 DPRINT1("HEAP: Failed releasing memory with Status 0x%08X. Heap %p, ptr %p, base address %p\n",
2363 Status, Heap, Ptr, VirtualEntry);
2365 }
2366 }
2367 else
2368 {
2369 /* Normal allocation */
2370 BlockSize = HeapEntry->Size;
2371
2372 // TODO: Tagging
2373
2374 /* Coalesce in kernel mode, and in usermode if it's not disabled */
2375 if (RtlpGetMode() == KernelMode ||
2377 {
2378 HeapEntry = (PHEAP_ENTRY)RtlpCoalesceFreeBlocks(Heap,
2379 (PHEAP_FREE_ENTRY)HeapEntry,
2380 &BlockSize,
2381 FALSE);
2382 }
2383
2384 /* See if we should decommit this block */
2385 if ((BlockSize >= Heap->DeCommitFreeBlockThreshold) ||
2386 (Heap->TotalFreeSize + BlockSize >= Heap->DeCommitTotalFreeThreshold))
2387 {
2388 RtlpDeCommitFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, BlockSize);
2389 }
2390 else
2391 {
2392 /* Insert into the free list */
2393 RtlpInsertFreeBlock(Heap, (PHEAP_FREE_ENTRY)HeapEntry, BlockSize);
2394
2395 if (RtlpGetMode() == UserMode &&
2396 TagIndex != 0)
2397 {
2398 // FIXME: Tagging
2400 }
2401 }
2402 }
2403
2404 /* Release the heap lock */
2406
2407 return TRUE;
2408}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define UNIMPLEMENTED
Definition: debug.h:118
struct _HEAP * PHEAP
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
NTSTATUS NTAPI RtlEnterHeapLock(IN OUT PHEAP_LOCK Lock, IN BOOLEAN Exclusive)
Definition: libsupp.c:110
KPROCESSOR_MODE NTAPI RtlpGetMode(VOID)
Definition: libsupp.c:55
NTSTATUS NTAPI RtlLeaveHeapLock(IN OUT PHEAP_LOCK Lock)
Definition: libsupp.c:135
#define ULONG_PTR
Definition: config.h:101
#define RemoveEntryList(Entry)
Definition: env_spec_w32.h:986
#define _SEH2_END
Definition: filesup.c:22
#define _SEH2_TRY
Definition: filesup.c:19
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
Definition: fsrtlfuncs.h:898
Status
Definition: gdiplustypes.h:25
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
NTSYSAPI void WINAPI RtlSetLastWin32ErrorAndNtStatusFromNtStatus(NTSTATUS)
#define KernelMode
Definition: asm.h:34
#define UserMode
Definition: asm.h:35
_In_ PMEMORY_AREA _In_ PVOID _In_ BOOLEAN Locked
Definition: newmm.h:209
#define HEAP_DISABLE_COALESCE_ON_FREE
Definition: nt_native.h:1699
#define NtCurrentProcess()
Definition: nt_native.h:1657
#define MEM_RELEASE
Definition: nt_native.h:1316
#define HEAP_NO_SERIALIZE
Definition: nt_native.h:1692
unsigned short USHORT
Definition: pedump.c:61
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:66
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
PHEAP_FREE_ENTRY NTAPI RtlpCoalesceFreeBlocks(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, PSIZE_T FreeSize, BOOLEAN Remove)
Definition: heap.c:1169
PHEAP_FREE_ENTRY NTAPI RtlpInsertFreeBlock(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, SIZE_T BlockSize)
Definition: heap.c:358
static VOID RtlpDeCommitFreeBlock(PHEAP Heap, PHEAP_FREE_ENTRY FreeEntry, SIZE_T Size)
Definition: heap.c:847
struct _HEAP_ENTRY * PHEAP_ENTRY
FORCEINLINE BOOLEAN RtlpHeapIsSpecial(ULONG Flags)
Definition: heap.h:59
BOOLEAN NTAPI RtlDebugFreeHeap(HANDLE HeapPtr, ULONG Flags, PVOID Ptr)
Definition: heapdbg.c:267
#define HEAP_SEGMENTS
Definition: heap.h:15
#define HEAP_ENTRY_VIRTUAL_ALLOC
Definition: heap.h:43
#define HEAP_ENTRY_BUSY
Definition: heap.h:40
Definition: heap.h:136
Definition: heap.h:130
Definition: heap.h:308
LIST_ENTRY Entry
Definition: heap.h:309
Definition: heap.c:52
ULONG Flags
Definition: heap.h:226
ULONG ForceFlags
Definition: heap.h:227
SIZE_T TotalFreeSize
Definition: heap.h:239
SIZE_T DeCommitFreeBlockThreshold
Definition: heap.h:237
PHEAP_LOCK LockVariable
Definition: heap.h:260
SIZE_T DeCommitTotalFreeThreshold
Definition: heap.h:238
ULONG_PTR SIZE_T
Definition: typedefs.h:80
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

◆ RtlInitializeBitMap()

NTSYSAPI void WINAPI RtlInitializeBitMap ( PRTL_BITMAP  ,
PULONG  ,
ULONG   
)

◆ RtlSetBits()

NTSYSAPI void WINAPI RtlSetBits ( PRTL_BITMAP  ,
ULONG  ,
ULONG   
)