Add support for dumping delay load PE data.

diff --git a/tools/winedump/dump.c b/tools/winedump/dump.c
index 5949381..91f4b0b 100644
--- a/tools/winedump/dump.c
+++ b/tools/winedump/dump.c
@@ -83,8 +83,16 @@
 {
     time_t 	t = (time_t)_t;
     const char *str = ctime(&t);
-    size_t len = strlen(str);
+    size_t len;
     static char	buf[128];
+
+    if (!str) /* not valid time */
+    {
+        strcpy(buf, "not valid time");
+        return buf;
+    }
+
+    len = strlen(str);
     /* FIXME: I don't get the same values from MS' pedump running under Wine...
      * I wonder if Wine isn't broken wrt to GMT settings...
      */
diff --git a/tools/winedump/pe.c b/tools/winedump/pe.c
index 708741d..4f71aab 100644
--- a/tools/winedump/pe.c
+++ b/tools/winedump/pe.c
@@ -116,7 +116,7 @@
     return get_dir_and_size(idx, 0);
 }
 
-static const char*	DirectoryNames[16] = {
+static const char * const DirectoryNames[16] = {
     "EXPORT",		"IMPORT",	"RESOURCE", 	"EXCEPTION",
     "SECURITY", 	"BASERELOC", 	"DEBUG", 	"ARCHITECTURE",
     "GLOBALPTR", 	"TLS", 		"LOAD_CONFIG",	"Bound IAT",
@@ -491,7 +491,7 @@
         else
         {
             iibn = RVA((DWORD)il->u1.AddressOfData, sizeof(DWORD));
-            if (!il)
+            if (!iibn)
                 printf("Can't grab import by name info, skipping to next ordinal\n");
             else
                 printf("  %4u  %s %lx\n", iibn->Hint, iibn->Name, (DWORD)il->u1.AddressOfData);
@@ -509,7 +509,7 @@
         else
         {
             iibn = RVA((DWORD)il->u1.AddressOfData, sizeof(DWORD));
-            if (!il)
+            if (!iibn)
                 printf("Can't grab import by name info, skipping to next ordinal\n");
             else
                 printf("  %4u  %s %lx\n", iibn->Hint, iibn->Name, (DWORD)il->u1.AddressOfData);
@@ -537,7 +537,7 @@
     nb_imp = directorySize / sizeof(*importDesc);
     if (!nb_imp) return;
 
-    printf("Import Table size: %lu\n", directorySize);/* FIXME */
+    printf("Import Table size: %08lx\n", directorySize);/* FIXME */
 
     for (i = 0; i < nb_imp - 1; i++) /* the last descr is set as 0 as a sentinel */
     {
@@ -550,7 +550,7 @@
 	    printf("<<<<<<<null entry\n");
 	    break;
 	}
-	printf("  offset %lu %s\n", Offset(importDesc), (char*)RVA(importDesc->Name, sizeof(DWORD)));
+	printf("  offset %08lx %s\n", Offset(importDesc), (char*)RVA(importDesc->Name, sizeof(DWORD)));
 	printf("  Hint/Name Table: %08lX\n", (DWORD)importDesc->u.OriginalFirstThunk);
 	printf("  TimeDataStamp:   %08lX (%s)\n",
 	       importDesc->TimeDateStamp, get_time_str(importDesc->TimeDateStamp));
@@ -576,6 +576,75 @@
     printf("\n");
 }
 
+static void dump_dir_delay_imported_functions(void)
+{
+    struct ImgDelayDescr
+    {
+        DWORD grAttrs;
+        DWORD szName;
+        DWORD phmod;
+        DWORD pIAT;
+        DWORD pINT;
+        DWORD pBoundIAT;
+        DWORD pUnloadIAT;
+        DWORD dwTimeStamp;
+    } *importDesc = get_dir(IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT);
+    unsigned nb_imp, i;
+    DWORD directorySize;
+
+    if (!importDesc) return;
+    if (PE_nt_headers->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+    {
+        IMAGE_OPTIONAL_HEADER64 *opt = (IMAGE_OPTIONAL_HEADER64 *)&PE_nt_headers->OptionalHeader;
+        directorySize = opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].Size;
+    }
+    else
+    {
+        IMAGE_OPTIONAL_HEADER32 *opt = (IMAGE_OPTIONAL_HEADER32 *)&PE_nt_headers->OptionalHeader;
+        directorySize = opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].Size;
+    }
+    nb_imp = directorySize / sizeof(*importDesc);
+    if (!nb_imp) return;
+
+    printf("Delay Import Table size: %08lx\n", directorySize); /* FIXME */
+
+    for (i = 0; i < nb_imp - 1; i++) /* the last descr is set as 0 as a sentinel */
+    {
+        BOOL use_rva = importDesc->grAttrs & 1;
+        IMAGE_THUNK_DATA32 *il;
+
+        if (!importDesc->szName || !importDesc->pIAT || !importDesc->pINT)
+        {
+            /* FIXME */
+            printf("<<<<<<<null entry\n");
+            break;
+        }
+        printf("  grAttrs %08lx offset %08lx %s\n", importDesc->grAttrs, Offset(importDesc),
+               use_rva ? (char *)RVA(importDesc->szName, sizeof(DWORD)) : (char *)importDesc->szName);
+        printf("  Hint/Name Table: %08lx\n", importDesc->pINT);
+        printf("  TimeDataStamp:   %08lX (%s)\n",
+               importDesc->dwTimeStamp, get_time_str(importDesc->dwTimeStamp));
+
+        printf("  Ordn  Name\n");
+
+        il = use_rva ? (IMAGE_THUNK_DATA32 *)RVA(importDesc->pINT, sizeof(DWORD)) : (IMAGE_THUNK_DATA32 *)importDesc->pINT;
+
+        if (!il)
+        {
+            printf("Can't grab thunk data, going to next imported DLL\n");
+            continue;
+        }
+
+        if (PE_nt_headers->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC)
+            dump_image_thunk_data64((IMAGE_THUNK_DATA64 *)il);
+        else
+            dump_image_thunk_data32(il);
+        printf("\n");
+        importDesc++;
+    }
+    printf("\n");
+}
+
 static	void	dump_dir_debug_dir(IMAGE_DEBUG_DIRECTORY* idd, int idx)
 {
     const	char*	str;
@@ -1026,7 +1095,10 @@
     if (globals.dumpsect)
     {
 	if (all || !strcmp(globals.dumpsect, "import"))
+        {
 	    dump_dir_imported_functions();
+	    dump_dir_delay_imported_functions();
+        }
 	if (all || !strcmp(globals.dumpsect, "export"))
 	    dump_dir_exported_functions();
 	if (all || !strcmp(globals.dumpsect, "debug"))