In the same way GlobalFree does already. --- dlls/kernel32/heap.c | 78 +++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 34 deletions(-)
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c index 6c5219b624f9..08139db4be98 100644 --- a/dlls/kernel32/heap.c +++ b/dlls/kernel32/heap.c @@ -329,41 +329,51 @@ SIZE_T WINAPI GlobalSize(HGLOBAL hmem) return 0; }
- if(ISPOINTER(hmem)) - { - retval=HeapSize(GetProcessHeap(), 0, hmem); - - if (retval == ~0ul) /* It might be a GMEM_MOVEABLE data pointer */ - { - retval = HeapSize(GetProcessHeap(), 0, (char*)hmem - HGLOBAL_STORAGE); - if (retval != ~0ul) retval -= HGLOBAL_STORAGE; - } - } - else - { - RtlLockHeap(GetProcessHeap()); - pintern=HANDLE_TO_INTERN(hmem); + RtlLockHeap(GetProcessHeap()); + __TRY + { + if(ISPOINTER(hmem)) + { + retval=HeapSize(GetProcessHeap(), 0, hmem); + + if (retval == ~0ul) /* It might be a GMEM_MOVEABLE data pointer */ + { + retval = HeapSize(GetProcessHeap(), 0, (char*)hmem - HGLOBAL_STORAGE); + if (retval != ~0ul) retval -= HGLOBAL_STORAGE; + } + } + else + { + pintern=HANDLE_TO_INTERN(hmem); + + if(pintern->Magic==MAGIC_GLOBAL_USED) + { + if (!pintern->Pointer) /* handle case of GlobalAlloc( ??,0) */ + retval = 0; + else + { + retval = HeapSize(GetProcessHeap(), 0, (char *)pintern->Pointer - HGLOBAL_STORAGE ); + if (retval != ~0ul) retval -= HGLOBAL_STORAGE; + } + } + else + { + WARN("invalid handle %p (Magic: 0x%04x)\n", hmem, pintern->Magic); + SetLastError(ERROR_INVALID_HANDLE); + retval=0; + } + } + } + __EXCEPT_PAGE_FAULT + { + SetLastError( ERROR_INVALID_HANDLE ); + retval = 0; + } + __ENDTRY + RtlUnlockHeap(GetProcessHeap());
- if(pintern->Magic==MAGIC_GLOBAL_USED) - { - if (!pintern->Pointer) /* handle case of GlobalAlloc( ??,0) */ - retval = 0; - else - { - retval = HeapSize(GetProcessHeap(), 0, (char *)pintern->Pointer - HGLOBAL_STORAGE ); - if (retval != ~0ul) retval -= HGLOBAL_STORAGE; - } - } - else - { - WARN("invalid handle %p (Magic: 0x%04x)\n", hmem, pintern->Magic); - SetLastError(ERROR_INVALID_HANDLE); - retval=0; - } - RtlUnlockHeap(GetProcessHeap()); - } - if (retval == ~0ul) retval = 0; - return retval; + if (retval == ~0ul) retval = 0; + return retval; }