Various registry-related PostScript driver enhancements.

diff --git a/dlls/wineps/init.c b/dlls/wineps/init.c
index 70028d2..fc96ddd 100644
--- a/dlls/wineps/init.c
+++ b/dlls/wineps/init.c
@@ -416,18 +416,17 @@
 }
 
 
-	
-
 /**********************************************************************
  *		PSDRV_FindPrinterInfo
  */
 PRINTERINFO *PSDRV_FindPrinterInfo(LPCSTR name) 
 {
     static PRINTERINFO *PSDRV_PrinterList;
-    DWORD type = REG_BINARY, needed, res;
+    DWORD type = REG_BINARY, needed, res, dwPaperSize;
     PRINTERINFO *pi = PSDRV_PrinterList, **last = &PSDRV_PrinterList;
     FONTNAME *font;
     AFM *afm;
+    HANDLE hPrinter;
 
     TRACE("'%s'\n", name);
     
@@ -454,10 +453,134 @@
 			  (LPBYTE)pi->Devmode, needed, &needed);
     }
 
-    PROFILE_GetWineIniString("psdrv", "ppdfile", "default.ppd",
-                             pi->Devmode->dmDrvPrivate.ppdFileName, 256);
+    if (OpenPrinterA (pi->FriendlyName, &hPrinter, NULL) == 0)
+    {
+	ERR ("OpenPrinterA failed with code %li\n", GetLastError ());
+	if (HeapFree (PSDRV_Heap, 0, pi->FriendlyName) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	if (HeapFree (PSDRV_Heap, 0, pi->Devmode) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	if (HeapFree (PSDRV_Heap, 0, pi) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	*last = NULL;
+	return NULL;
+    }
+
+    res = GetPrinterDataA (hPrinter, "PPD File", NULL,
+	    pi->Devmode->dmDrvPrivate.ppdFileName, 256, &needed);
+    if (res != ERROR_SUCCESS)
+    {
+	ERR ("Error %li getting PPD file name for printer '%s'\n", res, name);
+	if (ClosePrinter (hPrinter) == 0)
+	    WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	*last = NULL;
+	return NULL;
+    }
+
+    res = GetPrinterDataA (hPrinter, "Paper Size", NULL, (LPBYTE) &dwPaperSize,
+	    sizeof (DWORD), &needed);
+    if (res == ERROR_SUCCESS)
+	pi->Devmode->dmPublic.u1.s1.dmPaperSize = (SHORT) dwPaperSize;
+    else if (res == ERROR_FILE_NOT_FOUND)
+	TRACE ("No 'Paper Size' for printer '%s'\n", name);
+    else
+    {
+	ERR ("GetPrinterDataA returned %li\n", res);
+	if (ClosePrinter (hPrinter) == 0)
+	    WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	*last = NULL;
+	return NULL;
+    }
+
+    res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable", NULL,
+	    0, &needed, &pi->FontSubTableSize);
+    if (res == ERROR_SUCCESS)
+	TRACE ("No 'FontSubTable' for printer '%s'\n", name);
+    else if (res == ERROR_MORE_DATA)
+    {
+	pi->FontSubTable = HeapAlloc (PSDRV_Heap, 0, needed);
+	if (pi->FontSubTable == NULL)
+	{
+	    ERR ("Failed to allocate %li bytes from heap\n", needed);
+	    if (ClosePrinter (hPrinter) == 0)
+		WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+	    *last = NULL;
+	    return NULL;
+	}
+
+	res = EnumPrinterDataExA (hPrinter, "PrinterDriverData\\FontSubTable",
+		(LPBYTE) pi->FontSubTable, needed, &needed,
+		&pi->FontSubTableSize);
+	if (res != ERROR_SUCCESS)
+	{
+	    ERR ("EnumPrinterDataExA returned %li\n", res);
+	    if (ClosePrinter (hPrinter) == 0)
+		WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+	    if (HeapFree (PSDRV_Heap, 0, pi->FontSubTable) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+            if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+		WARN ("HeapFree failed with code %li\n", GetLastError ());
+	    *last = NULL;
+	    return NULL;
+	}
+    }
+    else	/* error in 1st call to EnumPrinterDataExA */
+    {
+	ERR ("EnumPrinterDataExA returned %li\n", res);
+	if (ClosePrinter (hPrinter) == 0)
+	    WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	*last = NULL;
+	return NULL;
+    }
+
+    if (ClosePrinter (hPrinter) == 0)
+    {
+	ERR ("ClosePrinter failed with code %li\n", GetLastError ());
+	if (ClosePrinter (hPrinter) == 0)
+	    WARN ("ClosePrinter failed with code %li\n", GetLastError ());
+	if (HeapFree (PSDRV_Heap, 0, pi->FontSubTable) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->FriendlyName) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi->Devmode) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+        if (HeapFree(PSDRV_Heap, 0, pi) == 0)
+	    WARN ("HeapFree failed with code %li\n", GetLastError ());
+	*last = NULL;
+	return NULL;
+    }
+
     pi->ppd = PSDRV_ParsePPD(pi->Devmode->dmDrvPrivate.ppdFileName);
     if(!pi->ppd) {
+	HeapFree(PSDRV_Heap, 0, pi->FontSubTable);
         HeapFree(PSDRV_Heap, 0, pi->FriendlyName);
         HeapFree(PSDRV_Heap, 0, pi->Devmode);
         HeapFree(PSDRV_Heap, 0, pi);