Small fixes for EnhMetaFile playback.

diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c
index b275c08..4ea7bcd 100644
--- a/objects/enhmetafile.c
+++ b/objects/enhmetafile.c
@@ -60,7 +60,7 @@
     ENHMETAFILEOBJ *metaObj = (ENHMETAFILEOBJ *)GDI_GetObjPtr( hmf,
 							   ENHMETAFILE_MAGIC );
     TRACE("hmf %04x -> enhmetaObj %p\n", hmf, metaObj);
-    return metaObj->emh;
+    return metaObj ? metaObj->emh : NULL;
 }
 
 /******************************************************************
@@ -108,7 +108,8 @@
     HENHMETAFILE hmf;
     HFILE hFile;
 
-    hFile = CreateFileA(lpszMetaFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
+    hFile = CreateFileA(lpszMetaFile, GENERIC_READ, FILE_SHARE_READ, 0,
+			OPEN_EXISTING, 0, 0);
     if (hFile == INVALID_HANDLE_VALUE) {
         WARN("could not open %s\n", lpszMetaFile);
 	return 0;
@@ -128,7 +129,8 @@
     HENHMETAFILE hmf;
     HFILE hFile;
 
-    hFile = CreateFileW(lpszMetaFile, GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
+    hFile = CreateFileW(lpszMetaFile, GENERIC_READ, FILE_SHARE_READ, 0,
+			OPEN_EXISTING, 0, 0);
     if (hFile == INVALID_HANDLE_VALUE) {
         WARN("could not open %s\n", debugstr_w(lpszMetaFile));
 	return 0;
@@ -156,6 +158,7 @@
 
     if (!buf) return sizeof(ENHMETAHEADER);
     emh = EMF_GetEnhMetaHeader(hmf);
+    if(!emh) return FALSE;
     memmove(buf, emh, MIN(sizeof(ENHMETAHEADER), bufsize));
     EMF_ReleaseEnhMetaHeader(hmf);
     return MIN(sizeof(ENHMETAHEADER), bufsize);
@@ -174,6 +177,7 @@
      LPENHMETAHEADER emh = EMF_GetEnhMetaHeader(hmf);
      INT first;
  
+     if(!emh) return FALSE;
      if(emh->nDescription == 0 || emh->offDescription == 0) {
          EMF_ReleaseEnhMetaHeader(hmf);
  	return 0;
@@ -210,7 +214,8 @@
     )
 {
      LPENHMETAHEADER emh = EMF_GetEnhMetaHeader(hmf);
- 
+
+     if(!emh) return FALSE;
      if(emh->nDescription == 0 || emh->offDescription == 0) {
          EMF_ReleaseEnhMetaHeader(hmf);
  	return 0;
@@ -548,9 +553,12 @@
 {
     BOOL ret = TRUE;
     LPENHMETARECORD p = (LPENHMETARECORD) EMF_GetEnhMetaHeader(hmf);
-    INT count = ((LPENHMETAHEADER) p)->nHandles;
-    HANDLETABLE *ht = HeapAlloc( GetProcessHeap(), 0, 
-				 sizeof(HANDLETABLE)*count);
+    INT count;
+    HANDLETABLE *ht;
+
+    if(!p) return FALSE;
+    count = ((LPENHMETAHEADER) p)->nHandles;
+    ht = HeapAlloc( GetProcessHeap(), 0, sizeof(HANDLETABLE)*count);
     ht->objectHandle[0] = hmf;
     while (ret) {
         ret = (*callback)(hdc, ht, p, count, data); 
@@ -580,11 +588,14 @@
       )
 {
     LPENHMETARECORD p = (LPENHMETARECORD) EMF_GetEnhMetaHeader(hmf);
-    INT count = ((LPENHMETAHEADER) p)->nHandles;
-    HANDLETABLE *ht = HeapAlloc( GetProcessHeap(), 0, 
-				 sizeof(HANDLETABLE) * count);
+    INT count;
+    HANDLETABLE *ht;
     BOOL ret = FALSE;
     INT savedMode = 0;
+
+    if(!p) return FALSE;
+    count = ((LPENHMETAHEADER) p)->nHandles;
+    ht = HeapAlloc( GetProcessHeap(), 0, sizeof(HANDLETABLE) * count);
     if (lpRect) {
         LPENHMETAHEADER h = (LPENHMETAHEADER) p;
 	FLOAT xscale = (h->rclBounds.right - h->rclBounds.left) /
@@ -640,6 +651,7 @@
     ENHMETAHEADER *emrSrc = EMF_GetEnhMetaHeader( hmfSrc ), *emrDst;
     HENHMETAFILE hmfDst;
 
+    if(!emrSrc) return FALSE;
     if (!file) {
         emrDst = HeapAlloc( SystemHeap, 0, emrSrc->nBytes );
 	memcpy( emrDst, emrSrc, emrSrc->nBytes );