diff --git a/dlls/kernel32/file.c b/dlls/kernel32/file.c
index 1e5b9fe3e7..bc38fdf646 100644
--- a/dlls/kernel32/file.c
+++ b/dlls/kernel32/file.c
@@ -75,7 +75,6 @@ static BOOL oem_file_apis;
 
 static const WCHAR wildcardsW[] = { '*','?',0 };
 static const WCHAR krnl386W[] = {'k','r','n','l','3','8','6','.','e','x','e','1','6',0};
-
 /***********************************************************************
  *              create_file_OF
  *
@@ -2820,6 +2819,7 @@ HANDLE WINAPI OpenFileById( HANDLE handle, LPFILE_ID_DESCRIPTOR id, DWORD access
     return result;
 }
 
+
 /***********************************************************************
  *             ReOpenFile (KERNEL32.@)
  */
@@ -2830,33 +2830,124 @@ HANDLE WINAPI ReOpenFile(HANDLE handle_original, DWORD access, DWORD sharing, DW
     return INVALID_HANDLE_VALUE;
 }
 
-
 /***********************************************************************
  *           K32EnumDeviceDrivers (KERNEL32.@)
  */
 BOOL WINAPI K32EnumDeviceDrivers(void **image_base, DWORD cb, DWORD *needed)
-{
-    FIXME("(%p, %d, %p): stub\n", image_base, cb, needed);
+{   
 
-    if (needed)
+    if (image_base != NULL) {
         *needed = 0;
+        NTSTATUS status;
+        ULONG ReturnLength;
+        ULONG ModuleCount, i;
+
+        ULONG SystemInformationLength = sizeof(SYSTEM_MODULE_INFORMATION);
+        SYSTEM_MODULE_INFORMATION* smi = HeapAlloc(GetProcessHeap(), 0, SystemInformationLength); 
+        SYSTEM_MODULE* sm;
+
+
+        status = NtQuerySystemInformation(SystemModuleInformation, smi, 0, &ReturnLength);
 
+        SystemInformationLength = ReturnLength;
+        smi = HeapReAlloc(GetProcessHeap(), 0, smi , SystemInformationLength);
+        status = NtQuerySystemInformation(SystemModuleInformation, smi, SystemInformationLength, &ReturnLength);
+
+        /* No modules returned? Leave */
+        if (smi->ModulesCount == 0)
+        {
+            return TRUE;
+        }
+
+        /* Try to find which module matches the base address given */
+        for (i = 0; i < smi->ModulesCount; ++i)
+        {   
+            image_base[i] = smi->Modules[i].ImageBaseAddress;
+            *needed += sizeof(PVOID);
+        }
+    } else if (needed) {
+        *needed = 0;
+    }
     return TRUE;
 }
 
+static BOOL NTAPI
+FindDeviceDriver(IN PVOID ImageBaseAddress,
+                 OUT PSYSTEM_MODULE MatchingModulePtr)
+{
+    NTSTATUS status;
+    ULONG ReturnLength;
+    ULONG ModuleCount, i;
+
+    ULONG SystemInformationLength = sizeof(SYSTEM_MODULE_INFORMATION);
+    SYSTEM_MODULE_INFORMATION* smi = HeapAlloc(GetProcessHeap(), 0, SystemInformationLength); 
+    SYSTEM_MODULE* sm;
+
+
+    status = NtQuerySystemInformation(SystemModuleInformation, smi, 0, &ReturnLength);
+
+    SystemInformationLength = ReturnLength;
+    smi = HeapReAlloc(GetProcessHeap(), 0, smi , SystemInformationLength);
+    status = NtQuerySystemInformation(SystemModuleInformation, 
+                                      smi, 
+                                      SystemInformationLength, 
+                                      &ReturnLength);
+
+    /* No modules returned? Leave */
+    if (smi->ModulesCount == 0)
+    {
+        return TRUE;
+    }
+
+    /* Try to find which module matches the base address given */
+    for (i = 0; i < smi->ModulesCount; ++i)
+    {
+        if (smi->Modules[i].ImageBaseAddress == ImageBaseAddress)
+        {
+            memcpy(MatchingModulePtr, &smi->Modules[i], sizeof(SYSTEM_MODULE));
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 /***********************************************************************
  *          K32GetDeviceDriverBaseNameA (KERNEL32.@)
  */
-DWORD WINAPI K32GetDeviceDriverBaseNameA(void *image_base, LPSTR base_name, DWORD size)
+DWORD WINAPI K32GetDeviceDriverBaseNameA(void *image_base, 
+                                         LPSTR base_name, 
+                                         DWORD size)
 {
-    FIXME("(%p, %p, %d): stub\n", image_base, base_name, size);
+    DWORD Len, LenWithNull;
+    SYSTEM_MODULE Module;
 
-    if (base_name && size)
+    if (!FindDeviceDriver(image_base, &Module))
+    {   
         base_name[0] = '\0';
+        return 0;
+    }
 
-    return 0;
+
+    Len =
+    LenWithNull = strlen(&Module.Name[Module.NameOffset]) + 1;
+    if (Len > size)
+    {
+        Len = size;
+    }
+
+
+    memcpy(base_name, &Module.Name[Module.NameOffset], Len);
+
+    if (Len == LenWithNull)
+    {
+        --Len;
+    }
+
+    return Len;
 }
 
+
 /***********************************************************************
  *           K32GetDeviceDriverBaseNameW (KERNEL32.@)
  */
