[PATCH 5/6] kernel32: Cleanup and simplify (Global|Local)Handle.

Rémi Bernon wine at gitlab.winehq.org
Fri Jun 10 03:19:58 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/kernel32/heap.c | 91 ++++++++++----------------------------------
 1 file changed, 21 insertions(+), 70 deletions(-)

diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index 2dac1555d8e..3ba9e139171 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -236,64 +236,10 @@ BOOL WINAPI GlobalUnlock( HGLOBAL handle )
 
 /***********************************************************************
  *           GlobalHandle   (KERNEL32.@)
- *
- * Get the handle associated with the pointer to a global memory block.
- *
- * RETURNS
- *      Handle: Success
- *      NULL: Failure
  */
 HGLOBAL WINAPI GlobalHandle( const void *ptr )
 {
-    struct mem_entry *mem;
-    HGLOBAL handle;
-    ULONG flags;
-
-    TRACE_(globalmem)( "ptr %p\n", ptr );
-
-    if (!ptr)
-    {
-        SetLastError( ERROR_INVALID_PARAMETER );
-        return 0;
-    }
-
-    RtlLockHeap( GetProcessHeap() );
-    __TRY
-    {
-        handle = 0;
-
-        /* note that if ptr is a pointer to a block allocated by           */
-        /* GlobalAlloc with GMEM_MOVEABLE then magic test in HeapValidate  */
-        /* will fail.                                                      */
-        if ((ptr = unsafe_ptr_from_HLOCAL( (HLOCAL)ptr )))
-        {
-            if (!RtlGetUserInfoHeap( GetProcessHeap(), HEAP_NO_SERIALIZE, (void *)ptr, &handle, &flags ))
-            {
-                SetLastError( ERROR_INVALID_HANDLE );
-                handle = 0;
-            }
-            break;
-        }
-        else handle = (HGLOBAL)ptr;
-
-        /* Now test handle either passed in or retrieved from pointer */
-        if ((mem = unsafe_mem_from_HLOCAL( handle )))
-        {
-            if (HeapValidate( GetProcessHeap(), HEAP_NO_SERIALIZE, mem->ptr )) /* obj(-handle) valid arena? */
-                break; /* valid moveable block */
-        }
-        handle = 0;
-        SetLastError( ERROR_INVALID_HANDLE );
-    }
-    __EXCEPT_PAGE_FAULT
-    {
-        SetLastError( ERROR_INVALID_HANDLE );
-        handle = 0;
-    }
-    __ENDTRY
-    RtlUnlockHeap( GetProcessHeap() );
-
-    return handle;
+    return LocalHandle( ptr );
 }
 
 /***********************************************************************
@@ -438,23 +384,28 @@ UINT WINAPI LocalFlags( HLOCAL handle )
 
 /***********************************************************************
  *           LocalHandle   (KERNEL32.@)
- *
- * Get the handle associated with the pointer to a local memory block.
- *
- * RETURNS
- *	Handle: Success
- *	NULL: Failure
- *
- * NOTES
- *  Windows memory management does not provide a separate local heap
- *  and global heap.
  */
-HLOCAL WINAPI LocalHandle(
-                LPCVOID ptr /* [in] Address of local memory block */
-) {
-    return GlobalHandle( ptr );
-}
+HLOCAL WINAPI LocalHandle( const void *ptr )
+{
+    HLOCAL handle;
+    ULONG flags;
+
+    TRACE_(globalmem)( "ptr %p\n", ptr );
 
+    if (!ptr)
+    {
+        SetLastError( ERROR_INVALID_PARAMETER );
+        return 0;
+    }
+
+    if (!RtlGetUserInfoHeap( GetProcessHeap(), 0, (void *)ptr, &handle, &flags ))
+    {
+        SetLastError( ERROR_INVALID_HANDLE );
+        return 0;
+    }
+
+    return handle;
+}
 
 /***********************************************************************
  *           LocalShrink   (KERNEL32.@)
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/222



More information about the wine-devel mailing list