Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

174 lines
5.3 KiB

/*++
Copyright (c) 1987-93 Microsoft Corporation
Module Name:
sizeof.c
Abstract:
Prints offsets of more commonly used fields in RPL data structures.
Author:
Vladimir Z. Vulovic (vladimv) 03 - February - 1993
Revision History:
03-Feb-1993 vladimv
Created
--*/
#include "local.h"
#include <ntcsrsrv.h>
#include <stdio.h>
typedef struct _HEAP_ENTRY {
//
// This field gives the size of the current block in allocation
// granularity units. (i.e. Size << HEAP_GRANULARITY_SHIFT
// equals the size in bytes).
//
USHORT Size;
//
// This field gives the size of the previous block in allocation
// granularity units. (i.e. PreviousSize << HEAP_GRANULARITY_SHIFT
// equals the size of the previous block in bytes).
//
USHORT PreviousSize;
//
// This field contains the index into the segment that controls
// the memory for this block.
//
UCHAR SegmentIndex;
//
// This field contains various flag bits associated with this block.
// Currently these are:
//
// 0x01 - block is busy
// 0x02 - allocated with VirtualAlloc
// 0x04 - busy block contains tail fill/free block contains free fill
// 0x08 - last block before uncommitted memory
// 0x10 - caller settable
// 0x20 - caller settable
// 0x40 - caller settable
// 0x80 - caller settable
//
// The high order 4 bits are settable by higher level heap interfaces.
// For example, the Win32 heap calls remember the DDESHARE and DISCARDABLE
// flags here. The pool manager remembers the pool type here.
//
UCHAR Flags;
//
// This field is for debugging purposes. It will normally contain a
// stack back trace index of the allocator for x86 systems.
//
union {
USHORT AllocatorBackTraceIndex;
struct {
UCHAR Index;
UCHAR Mask;
} FreeListBitIndex;
} u0;
//
// Format of the remaining fields depends on whether this is an
// busy or free block.
//
union {
struct {
//
// This field contains the number of unused bytes at the end of this
// block that were not actually allocated. Used to compute exact
// size requested prior to rounding requested size to allocation
// granularity. Also used for tail checking purposes.
//
ULONG UnusedBytes : 8;
//
// This field is currently unused, but is intended for storing
// any encoded value that will give the that gives the type of object
// allocated.
//
ULONG Type : 24;
//
// This field is a 32-bit settable value that a higher level heap package
// can use. The Win32 heap manager stores handle values in this field.
//
ULONG Settable;
} BusyBlock;
struct {
//
// Free blocks use these two words for linking together free blocks
// of the same size on a doubly linked list.
//
LIST_ENTRY FreeList;
} FreeBlock;
} u;
} HEAP_ENTRY, *PHEAP_ENTRY;
void _CRTAPI1 main( void) {
printf("FIELD_OFFSET( RCVBUF, u.SendFileRequest.seq_num) == %d == 0x%x\n",
FIELD_OFFSET( RCVBUF, u.SendFileRequest.seq_num),
FIELD_OFFSET( RCVBUF, u.SendFileRequest.seq_num));
printf("FIELD_OFFSET( OPEN_INFO, adapt_info_ptr) == %d == 0x%x\n",
FIELD_OFFSET( OPEN_INFO, adapt_info_ptr),
FIELD_OFFSET( OPEN_INFO, adapt_info_ptr));
printf("sizeof( ADAPTER_INFO) == %d == 0x%x\n",
sizeof( ADAPTER_INFO),
sizeof( ADAPTER_INFO));
printf("FIELD_OFFSET( ADAPTER_INFO, u1.r1.pFirstBuffer) == %d == 0x%x\n",
FIELD_OFFSET( ADAPTER_INFO, u1.r1.pFirstBuffer),
FIELD_OFFSET( ADAPTER_INFO, u1.r1.pFirstBuffer));
printf("FIELD_OFFSET( ADAPTER_INFO, u3.r1.Type.Event.pReceivedFrame) == %d == 0x%x\n",
FIELD_OFFSET( ADAPTER_INFO, u3.r1.Type.Event.pReceivedFrame),
FIELD_OFFSET( ADAPTER_INFO, u3.r1.Type.Event.pReceivedFrame));
printf("FIELD_OFFSET( FIND_FRAME, source_addr) == %d == 0x%x\n",
FIELD_OFFSET( FIND_FRAME, source_addr),
FIELD_OFFSET( FIND_FRAME, source_addr));
printf("FIELD_OFFSET( RCB, AdapterName) == %d == 0x%x\n",
FIELD_OFFSET( RCB, AdapterName),
FIELD_OFFSET( RCB, AdapterName));
printf("FIELD_OFFSET( RCB, lan_rcb_ptr) == %d == 0x%x\n",
FIELD_OFFSET( RCB, lan_rcb_ptr),
FIELD_OFFSET( RCB, lan_rcb_ptr));
printf("FIELD_OFFSET( LLC_NOT_CONTIGUOUS_BUFFER, auchLanHeader) == %d == 0x%x\n",
FIELD_OFFSET( LLC_NOT_CONTIGUOUS_BUFFER, auchLanHeader),
FIELD_OFFSET( LLC_NOT_CONTIGUOUS_BUFFER, auchLanHeader));
printf("FIELD_OFFSET( LLC_CCB, u.pParameterTable) == %d == 0x%x\n",
FIELD_OFFSET( LLC_CCB, u.pParameterTable),
FIELD_OFFSET( LLC_CCB, u.pParameterTable));
printf("FIELD_OFFSET( CSR_PROCESS, ProcessHandle) == %d == 0x%x\n",
FIELD_OFFSET( CSR_PROCESS, ProcessHandle),
FIELD_OFFSET( CSR_PROCESS, ProcessHandle));
printf("sizeof( HEAP_ENTRY) == %d == 0x%x\n",
sizeof( HEAP_ENTRY),
sizeof( HEAP_ENTRY));
}