windows-nt/Source/XPSP1/NT/base/mvdm/wow16/mmsystem/task.c
2020-09-26 16:20:57 +08:00

118 lines
3.6 KiB
C

/******************************************************************************
Copyright (C) Microsoft Corporation 1985-1990. All rights reserved.
Title: task.c - support for task creation and blocking
Version: 1.00
Date: 05-Mar-1990
Author: ROBWI
------------------------------------------------------------------------------
Change log:
DATE REV DESCRIPTION
----------- ----- -----------------------------------------------------------
05-MAR-1990 ROBWI First Version - APIs and structures
18-APR-1990 ROBWI Ported from Resman to mmsystem
25-JUN-1990 ROBWI Added mmTaskYield
07-JUL-1991 CJP Modified to work with new stack switcher code
*****************************************************************************/
#include <windows.h>
#include "mmsystem.h"
#include "mmsysi.h"
#include "mmddk.h"
#include "mmtask\mmtask.h"
UINT FAR PASCAL BWinExec(LPSTR lpModuleName, UINT wCmdShow, LPVOID lpParameters);
/***************************************************************************
*
* @doc DDK MMSYSTEM TASK
*
* @api UINT | mmTaskCreate | This function creates a new task.
*
* @parm LPTASKCALLBACK | lpfn | Points to a program supplied
* function and represents the starting address of the new
* task.
*
* @parm HTASK FAR * | lph | Points to the variable that receives the
* task identifier. This may be NULL in some versions. This
* is not an error it simply means that the system could not
* determine the task handle of the newly created task.
*
* @parm DWORD | dwStack | Specifies the size of the stack to be
* provided to the task.
*
* @parm DWORD | dwInst | DWORD of instance data to pass to the task
* routine.
*
* @rdesc Returns zero if the function is successful. Otherwise it
* returns an error value which may be one of the following:
*
* @flag TASKERR_NOTASKSUPPORT | Task support is not available.
* @flag TASKERR_OUTOFMEMORY | Not enough memory to create task.
*
* @comm When a mmsystem task is created, the system will make a far
* call to the program-supplied function whose address is
* specified by the lpfn parameter. This function may include
* local variables and may call other functions as long as
* the stack has sufficient space.
*
* The task terminates when it returns.
*
* @xref mmTaskSignal mmTaskBlock
*
***************************************************************************/
UINT WINAPI mmTaskCreate(LPTASKCALLBACK lpfn, HTASK FAR * lph, DWORD dwInst)
{
MMTaskStruct TaskStruct;
char szName[20];
UINT wRes;
HTASK hTask;
/*
create another app. so that we can run the stream outside of
the context of the app.
*/
if (!LoadString(ghInst, IDS_TASKSTUB, szName, sizeof(szName)))
return TASKERR_NOTASKSUPPORT;
TaskStruct.cb = sizeof(TaskStruct);
TaskStruct.lpfn = lpfn;
TaskStruct.dwInst = dwInst;
TaskStruct.dwStack = 0L;
wRes = BWinExec(szName, SW_SHOWNOACTIVATE, &TaskStruct);
if (wRes > 32)
{
hTask = wRes;
wRes = MMSYSERR_NOERROR;
}
else if (wRes == 0)
{
wRes = TASKERR_OUTOFMEMORY;
hTask = NULL;
}
else
{
wRes = TASKERR_NOTASKSUPPORT;
hTask = NULL;
}
if (lph)
*lph = hTask;
DPRINTF2("mmTaskCreate: hTask = %04X, wErr = %04X\r\n", hTask, wRes);
return wRes;
}