Starting implementation of MCI creator tasks
Fixed bug in MCI_OPEN handling (thanks to Adam for reporting this one) Better implementation of mmTaskCreate16
This commit is contained in:
parent
0f9901b4cc
commit
4e65995b16
|
@ -17,6 +17,7 @@
|
||||||
#include "selectors.h"
|
#include "selectors.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "digitalv.h"
|
#include "digitalv.h"
|
||||||
|
#include "wine/winbase16.h"
|
||||||
|
|
||||||
struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
|
struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
|
||||||
|
|
||||||
|
@ -1042,6 +1043,7 @@ DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
|
||||||
if (LOWORD((DWORD)lpParms->lpstrDeviceType) != MCI_DEVTYPE_CD_AUDIO) {
|
if (LOWORD((DWORD)lpParms->lpstrDeviceType) != MCI_DEVTYPE_CD_AUDIO) {
|
||||||
FIXME(mci, "MCI_OPEN_TYPE_ID is no longer properly supported\n");
|
FIXME(mci, "MCI_OPEN_TYPE_ID is no longer properly supported\n");
|
||||||
}
|
}
|
||||||
|
uDevType = LOWORD((DWORD)lpParms->lpstrDeviceType);
|
||||||
} else {
|
} else {
|
||||||
if (lpParms->lpstrDeviceType == NULL)
|
if (lpParms->lpstrDeviceType == NULL)
|
||||||
return MCIERR_NULL_PARAMETER_BLOCK;
|
return MCIERR_NULL_PARAMETER_BLOCK;
|
||||||
|
@ -1096,6 +1098,7 @@ DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
|
||||||
dwRet = MCI_SendCommand(wDevID, MCI_OPEN_DRIVER, dwParam, (DWORD)lpParms);
|
dwRet = MCI_SendCommand(wDevID, MCI_OPEN_DRIVER, dwParam, (DWORD)lpParms);
|
||||||
MCI_GetDrv(wDevID)->lpfnYieldProc = 0;
|
MCI_GetDrv(wDevID)->lpfnYieldProc = 0;
|
||||||
MCI_GetDrv(wDevID)->dwYieldData = 0;
|
MCI_GetDrv(wDevID)->dwYieldData = 0;
|
||||||
|
MCI_GetDrv(wDevID)->hCreatorTask = GetCurrentTask();
|
||||||
|
|
||||||
if (dwRet == 0) {
|
if (dwRet == 0) {
|
||||||
/* only handled devices fall through */
|
/* only handled devices fall through */
|
||||||
|
|
|
@ -1491,7 +1491,7 @@ DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwPar
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, TRUE);
|
dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, TRUE);
|
||||||
TRACE(mci, "=> %08ld\n", dwRet);
|
TRACE(mci, "=> %08lx\n", dwRet);
|
||||||
return dwRet;
|
return dwRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1739,8 +1739,7 @@ YIELDPROC WINAPI mciGetYieldProc(UINT uDeviceID, DWORD* lpdwYieldData)
|
||||||
*/
|
*/
|
||||||
HTASK16 WINAPI mciGetCreatorTask16(UINT16 uDeviceID)
|
HTASK16 WINAPI mciGetCreatorTask16(UINT16 uDeviceID)
|
||||||
{
|
{
|
||||||
FIXME(mci, "(%u) stub\n", uDeviceID);
|
return mciGetCreatorTask(uDeviceID);
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -1748,8 +1747,15 @@ HTASK16 WINAPI mciGetCreatorTask16(UINT16 uDeviceID)
|
||||||
*/
|
*/
|
||||||
HTASK WINAPI mciGetCreatorTask(UINT uDeviceID)
|
HTASK WINAPI mciGetCreatorTask(UINT uDeviceID)
|
||||||
{
|
{
|
||||||
FIXME(mci, "(%u) stub\n", uDeviceID);
|
HTASK ret;
|
||||||
return 0;
|
|
||||||
|
TRACE(mci, "(%u)\n", uDeviceID);
|
||||||
|
|
||||||
|
ret = (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) ?
|
||||||
|
0 : MCI_GetDrv(uDeviceID)->hCreatorTask;
|
||||||
|
|
||||||
|
TRACE(mci, "=> %04x\n", ret);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -1762,7 +1768,7 @@ UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID)
|
||||||
TRACE(mmsys,"(%04x)\n", uDeviceID);
|
TRACE(mmsys,"(%04x)\n", uDeviceID);
|
||||||
if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
|
if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
|
||||||
!MCI_GetDrv(uDeviceID)->lpfnYieldProc || MCI_GetDrv(uDeviceID)->bIs32) {
|
!MCI_GetDrv(uDeviceID)->lpfnYieldProc || MCI_GetDrv(uDeviceID)->bIs32) {
|
||||||
OldYield16();
|
UserYield16();
|
||||||
} else {
|
} else {
|
||||||
ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
|
ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
|
||||||
}
|
}
|
||||||
|
@ -1780,7 +1786,7 @@ UINT WINAPI mciDriverYield(UINT uDeviceID)
|
||||||
TRACE(mmsys,"(%04x)\n", uDeviceID);
|
TRACE(mmsys,"(%04x)\n", uDeviceID);
|
||||||
if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
|
if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
|
||||||
!MCI_GetDrv(uDeviceID)->lpfnYieldProc || !MCI_GetDrv(uDeviceID)->bIs32) {
|
!MCI_GetDrv(uDeviceID)->lpfnYieldProc || !MCI_GetDrv(uDeviceID)->bIs32) {
|
||||||
OldYield16();
|
UserYield16();
|
||||||
} else {
|
} else {
|
||||||
ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
|
ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
|
||||||
}
|
}
|
||||||
|
@ -4356,19 +4362,19 @@ BOOL16 WINAPI mmThreadIsValid16(HANDLE16 handle)
|
||||||
*/
|
*/
|
||||||
HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR lphnd, HINSTANCE16 *hMmTask, DWORD dwPmt)
|
HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR lphnd, HINSTANCE16 *hMmTask, DWORD dwPmt)
|
||||||
{
|
{
|
||||||
#if 1
|
DWORD showCmd = 0x40002;
|
||||||
DWORD showCmd = 0x40002;
|
LPSTR cmdline;
|
||||||
LPSTR cmdline;
|
WORD sel1, sel2;
|
||||||
WORD sel1, sel2;
|
LOADPARAMS16* lp;
|
||||||
LOADPARAMS16 *lp;
|
HINSTANCE16 ret;
|
||||||
HINSTANCE16 ret, handle;
|
HINSTANCE16 handle;
|
||||||
|
|
||||||
TRACE(mmsys, "(%08lx,%p,%08lx);\n", lphnd, hMmTask, dwPmt);
|
TRACE(mmsys, "(%08lx,%p,%08lx);\n", lphnd, hMmTask, dwPmt);
|
||||||
cmdline = (LPSTR)HeapAlloc(GetProcessHeap(), 0, 0x0d);
|
cmdline = (LPSTR)HeapAlloc(GetProcessHeap(), 0, 0x0d);
|
||||||
cmdline[0] = 0x0d;
|
cmdline[0] = 0x0d;
|
||||||
(DWORD)cmdline[1] = (DWORD)lphnd;
|
*(LPDWORD)(cmdline + 1) = (DWORD)lphnd;
|
||||||
(DWORD)cmdline[5] = dwPmt;
|
*(LPDWORD)(cmdline + 5) = dwPmt;
|
||||||
(DWORD)cmdline[9] = 0;
|
*(LPDWORD)(cmdline + 9) = 0;
|
||||||
|
|
||||||
sel1 = SELECTOR_AllocBlock(cmdline, 0x0d, SEGMENT_DATA, FALSE, FALSE);
|
sel1 = SELECTOR_AllocBlock(cmdline, 0x0d, SEGMENT_DATA, FALSE, FALSE);
|
||||||
sel2 = SELECTOR_AllocBlock(&showCmd, sizeof(showCmd),
|
sel2 = SELECTOR_AllocBlock(&showCmd, sizeof(showCmd),
|
||||||
|
@ -4380,16 +4386,11 @@ HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR lphnd, HINSTANCE16 *hMmTask, DWORD dwPm
|
||||||
lp->showCmd = PTR_SEG_OFF_TO_SEGPTR(sel2, 0);
|
lp->showCmd = PTR_SEG_OFF_TO_SEGPTR(sel2, 0);
|
||||||
lp->reserved = 0;
|
lp->reserved = 0;
|
||||||
|
|
||||||
ret = LoadModule16("c:\\windows\\system\\mmtask.tsk", lp);
|
handle = LoadModule16("c:\\windows\\system\\mmtask.tsk", lp);
|
||||||
TRACE(mmsys, "MMtask's handle = 0x%04x\n", ret);
|
if (handle < 32) {
|
||||||
if (ret < 32) {
|
ret = (handle) ? 1 : 2;
|
||||||
if (ret)
|
|
||||||
ret = 1;
|
|
||||||
else
|
|
||||||
ret = 2;
|
|
||||||
handle = 0;
|
handle = 0;
|
||||||
} else {
|
} else {
|
||||||
handle = ret;
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
if (hMmTask)
|
if (hMmTask)
|
||||||
|
@ -4400,15 +4401,9 @@ HINSTANCE16 WINAPI mmTaskCreate16(SEGPTR lphnd, HINSTANCE16 *hMmTask, DWORD dwPm
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, lp);
|
HeapFree(GetProcessHeap(), 0, lp);
|
||||||
HeapFree(GetProcessHeap(), 0, cmdline);
|
HeapFree(GetProcessHeap(), 0, cmdline);
|
||||||
|
|
||||||
TRACE(mmsys, "=> 0x%04x/%d %04x\n", handle, ret, *(LPWORD)PTR_SEG_TO_LIN(lphnd));
|
TRACE(mmsys, "=> 0x%04x/%d\n", handle, ret);
|
||||||
return ret;
|
return ret;
|
||||||
#else
|
|
||||||
TRACE(mmsys, "(%p,%p,%08lx);\n", lphnd, hMmTask, x2);
|
|
||||||
if (hMmTask)
|
|
||||||
*hMmTask = 0xfade;
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -4456,3 +4451,14 @@ BOOL16 WINAPI mmShowMMCPLPropertySheet16(WORD w1, WORD w2, WORD w3, WORD w4, WOR
|
||||||
FIXME(mmsys, "%04x %04x %04x %04x %04x %04x %04x\n", w1, w2, w3, w4, w5, w6, w7);
|
FIXME(mmsys, "%04x %04x %04x %04x %04x %04x %04x\n", w1, w2, w3, w4, w5, w6, w7);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* StackEnter & StackLeave [MMSYSTEM.32][MMSYSTEM.33]
|
||||||
|
*/
|
||||||
|
void WINAPI StackEnterLeave16(void)
|
||||||
|
{
|
||||||
|
#ifdef __i386__
|
||||||
|
/* mmsystem.dll from Win 95 does only this: so does Wine */
|
||||||
|
__asm__("stc");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue