mmioDescend: fixed FIND_xxxx, verified with mciavi32.dll.
mciLoadCommandResource32: second arg is wide string
mciGetDriverData: spec has just one long argument

diff --git a/multimedia/mmio.c b/multimedia/mmio.c
index eda159b..4586fcb 100644
--- a/multimedia/mmio.c
+++ b/multimedia/mmio.c
@@ -931,6 +931,7 @@
                           const MMCKINFO * lpckParent, UINT16 uFlags)
 {
 	DWORD	dwfcc, dwOldPos;
+	LPDWORD	tocheck;
 
 	TRACE(mmio, "(%04X, %p, %p, %04X);\n", 
 				hmmio, lpck, lpckParent, uFlags);
@@ -948,18 +949,27 @@
 		TRACE(mmio, "seek inside parent at %ld !\n", lpckParent->dwDataOffset);
 		dwOldPos = mmioSeek32(hmmio,lpckParent->dwDataOffset,SEEK_SET);
 	}
-/*
 
-   It seems to be that FINDRIFF should not be treated the same as the 
-   other FINDxxx so I treat it as a MMIO_FINDxxx
+	/* The SDK docu says 'ckid' is used for all cases. Real World
+	 * examples disagree -Marcus,990216. 
+	 */
 
-	if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDRIFF) || 
-		(uFlags & MMIO_FINDLIST)) {
-*/
-	if ((uFlags & MMIO_FINDCHUNK) || (uFlags & MMIO_FINDLIST)) {
+	/* find_chunk looks for 'ckid' */
+	if (uFlags & MMIO_FINDCHUNK) {
+		tocheck = &(lpck->ckid);
+		dwfcc = lpck->ckid;
+	}
+	/* find_riff and find_list look for 'fccType' */
+	if (uFlags & (MMIO_FINDLIST|MMIO_FINDRIFF)) {
+		dwfcc = lpck->fccType;
+		tocheck = &(lpck->fccType);
+	}
+
+	if (uFlags & (MMIO_FINDCHUNK|MMIO_FINDLIST|MMIO_FINDRIFF)) {
 		TRACE(mmio, "MMIO_FINDxxxx dwfcc=%08lX !\n", dwfcc);
 		while (TRUE) {
 		        LONG ix;
+			char fcc[5],ckid[5];
 
 			ix = mmioRead32(hmmio, (LPSTR)lpck, 3 * sizeof(DWORD));
 			TRACE(mmio, "after _lread32 ix = %ld req = %d, errno = %d\n",ix,3 * sizeof(DWORD),errno);
@@ -969,23 +979,28 @@
 				return MMIOERR_CHUNKNOTFOUND;
 			}
 			lpck->dwDataOffset = dwOldPos + 2 * sizeof(DWORD);
-			if (lpck->ckid == FOURCC_RIFF || lpck->ckid == FOURCC_LIST) 
-				lpck->dwDataOffset += sizeof(DWORD);
 			if (ix < lpck->dwDataOffset - dwOldPos) {
 				mmioSeek32(hmmio, dwOldPos, SEEK_SET);
 				WARN(mmio, "return ChunkNotFound\n");
 				return MMIOERR_CHUNKNOTFOUND;
 			}
-			TRACE(mmio, "dwfcc=%08lX ckid=%08lX cksize=%08lX !\n", 
-									dwfcc, lpck->ckid, lpck->cksize);
-			if (dwfcc == lpck->ckid)
+			memcpy(fcc,&dwfcc,4);fcc[4]='\0';
+			memcpy(ckid,&lpck->ckid,4);ckid[4]='\0';
+			TRACE(mmio, "dwfcc=%s ckid=%s cksize=%08lX !\n", fcc, ckid, lpck->cksize);
+			if (dwfcc == *tocheck)
 				break;
 
 			dwOldPos = lpck->dwDataOffset + lpck->cksize;
 			mmioSeek32(hmmio, dwOldPos, SEEK_SET);
 		}
-	}
-	else {
+		/* If we were looking for RIFF/LIST chunks, the final dataptr
+		 * is after the chunkid. If we were just looking for the chunk
+		 * it is after the cksize. So add 4 in RIFF/LIST case.
+		 */
+		if (uFlags & (MMIO_FINDLIST|MMIO_FINDRIFF))
+			lpck->dwDataOffset+=sizeof(DWORD);
+	} else {
+		/* FIXME: unverified, does it do this? */
 		if (mmioRead32(hmmio, (LPSTR)lpck, sizeof(MMCKINFO)) < sizeof(MMCKINFO)) {
 			mmioSeek32(hmmio, dwOldPos, SEEK_SET);
 			WARN(mmio, "return ChunkNotFound 2nd\n");
@@ -996,11 +1011,8 @@
 			lpck->dwDataOffset += sizeof(DWORD);
 	}
 	mmioSeek32(hmmio, lpck->dwDataOffset, SEEK_SET);
-
-	TRACE(mmio, "lpck->ckid=%08lX lpck->cksize=%ld !\n", 
-								lpck->ckid, lpck->cksize);
+	TRACE(mmio, "lpck->ckid=%08lX lpck->cksize=%ld !\n", lpck->ckid, lpck->cksize);
 	TRACE(mmio, "lpck->fccType=%08lX !\n", lpck->fccType);
-
 	return 0;
 }