16,370
社区成员




42: HGLOBAL
43: WINAPI
44: GlobalAlloc(
45: UINT uFlags,
46: SIZE_T dwBytes
47: )
48: {
49: PBASE_HANDLE_TABLE_ENTRY HandleEntry;
50: HANDLE hMem;
51: LPSTR p;
52: ULONG Flags;
53:
54: if (uFlags & ~GMEM_VALID_FLAGS) {
55: SetLastError( ERROR_INVALID_PARAMETER );
56: return( NULL );
57: }
58:
59: Flags = 0;
60: if (uFlags & GMEM_ZEROINIT) {
61: Flags |= HEAP_ZERO_MEMORY;
62: }
63:
64: if (!(uFlags & GMEM_MOVEABLE)) {
65: if (uFlags & GMEM_DDESHARE) {
66: Flags |= BASE_HEAP_FLAG_DDESHARE;
67: }
68:
69: p = RtlAllocateHeap( BaseHeap,
70: MAKE_TAG( GMEM_TAG ) | Flags,
71: dwBytes ? dwBytes : 1
72: );
73:
74: if (p == NULL) {
75: SetLastError( ERROR_NOT_ENOUGH_MEMORY );
76: }
77:
78: return p;
79: }
80:
81: p = NULL;
82: RtlLockHeap( BaseHeap );
83: Flags |= HEAP_NO_SERIALIZE | HEAP_SETTABLE_USER_VALUE | BASE_HEAP_FLAG_MOVEABLE;
84: try {
85: HandleEntry = (PBASE_HANDLE_TABLE_ENTRY)RtlAllocateHandle( &BaseHeapHandleTable, NULL );
86: if (HandleEntry == NULL) {
87: SetLastError( ERROR_NOT_ENOUGH_MEMORY );
88: goto Fail;
89: }
90:
91: hMem = (HANDLE)&HandleEntry->Object;
92: if (dwBytes != 0) {
93: p = (LPSTR)RtlAllocateHeap( BaseHeap, MAKE_TAG( GMEM_TAG ) | Flags, dwBytes );
94: if (p == NULL) {
95: HandleEntry->Flags = RTL_HANDLE_ALLOCATED;
96: RtlFreeHandle( &BaseHeapHandleTable, (PRTL_HANDLE_TABLE_ENTRY)HandleEntry );
97: HandleEntry = NULL;
98: SetLastError( ERROR_NOT_ENOUGH_MEMORY );
99: }
100: else {
101: RtlSetUserValueHeap( BaseHeap, HEAP_NO_SERIALIZE, p, hMem );
102: }
103: }
104: Fail: ;
105: }
106: except (EXCEPTION_EXECUTE_HANDLER) {
107: BaseSetLastNTError( GetExceptionCode() );
108: }
109:
110: RtlUnlockHeap( BaseHeap );
111:
112: if (HandleEntry != NULL) {
113: HandleEntry->Object = p;
114: if (p != NULL) {
115: HandleEntry->Flags = RTL_HANDLE_ALLOCATED;
116: }
117: else {
118: HandleEntry->Flags = RTL_HANDLE_ALLOCATED | BASE_HANDLE_DISCARDED;
119: }
120:
121: if (uFlags & GMEM_DISCARDABLE) {
122: HandleEntry->Flags |= BASE_HANDLE_DISCARDABLE;
123: }
124:
125: if (uFlags & GMEM_MOVEABLE) {
126: HandleEntry->Flags |= BASE_HANDLE_MOVEABLE;
127: }
128:
129: if (uFlags & GMEM_DDESHARE) {
130: HandleEntry->Flags |= BASE_HANDLE_SHARED;
131: }
132:
133: p = (LPSTR)hMem;
134: }
135:
136: return( (HANDLE)p );
137: }
36: void * __cdecl
37: malloc(
38: size_t sz
39: )
40: {
41:
42: return RtlAllocateHeap( RtlProcessHeap(), 0, sz );
43:
44: }
File: C:\windows_2000_source_code\win2k\private\ntos\rtl\heap.c
86: RtlDebugCreateHeap (
96: RtlDebugDestroyHeap (
101: RtlDebugAllocateHeap (
108: RtlDebugFreeHeap (
115: RtlDebugSizeHeap (
122: RtlDebugZeroHeap (
135: RtlpCreateUnCommittedRange (
140: RtlpDestroyUnCommittedRange (
146: RtlpInsertUnCommittedPages (
153: RtlpDestroyHeapSegment (
158: RtlpExtendHeap (
191: RtlCreateHeap (
1133: RtlDestroyHeap (
1316: RtlAllocateHeap (
2075: RtlAllocateHeapSlowly (
2931: RtlFreeHeap (
3273: RtlFreeHeapSlowly (
3655: RtlSizeHeap (
3762: RtlZeroHeap (
3962: RtlpCreateUnCommittedRange (
4169: RtlpDestroyUnCommittedRange (
4227: RtlpInsertUnCommittedPages (
4422: RtlpFindAndCommitPages (
4732: RtlpInitializeHeapSegment (
4959: RtlpDestroyHeapSegment (
5024: RtlpExtendHeap (
5312: RtlpCoalesceFreeBlocks (
5527: RtlpDeCommitFreeBlock (
5849: RtlpInsertFreeBlock (
6008: RtlpGetExtraStuffPointer (
6070: RtlpGetSizeOfBigBlock (
6117: RtlpCheckBusyBlockTail (
File: C:\windows_2000_source_code\win2k\private\shell\win16\commctrl\mem.c
192: void NEAR* NEAR HeapAlloc(HHEAP hhp, WORD cb)
193: {
194: void NEAR* pb;
195:
196: _asm {
197: push ds
198: mov ds,hhp
199: }
200:
201: pb = (void NEAR*)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, cb);
202:
203: if (pb)
204: ((HEAP NEAR*)0)->cAlloc++;
205:
206: _asm {
207: pop ds
208: }
209:
210: return pb;
211: }
http://bbs.csdn.net/topics/390374955里面有windows_2000_source_code的下载链接