📄 emulserv.cpp
字号:
fRet = FALSE;
goto EXIT;
}
// Hook the interrupt and start the associated thread.
if ( !StartIST() )
{
fRet = FALSE;
goto EXIT;
}
InitializeCriticalSection(&g_csMain);
deviceInitialized = TRUE;
fRet = TRUE;
EXIT:
if (fRet == FALSE) {
if (v_EmulServDevice) {
VirtualFree((LPVOID)v_EmulServDevice, 0, MEM_RELEASE);
v_EmulServDevice = NULL;
}
}
if (vpIOPRegs) {
VirtualFree((LPVOID)vpIOPRegs, 0, MEM_RELEASE);
}
return fRet;
}
/*------------------------------------------------------------------
DeInitializeGlobals
------------------------------------------------------------------*/
void
DeInitializeGlobals(void)
{
StopIST();
DeleteCriticalSection(&g_csMain);
deviceInitialized = FALSE;
}
//------------------------------------------------------------------
// AckInterrupt
//------------------------------------------------------------------
ULONG
AckInterrupt()
{
DEBUGMSG( TRUE, (TEXT("EmulatorServices:AckInterrupt() In ISR, ACKing Interrupt")) );
return v_EmulServDevice->InterruptPending;
}
VOID
InstallInterrupt()
{
DEBUGMSG( TRUE, (TEXT("EmulatorServices:InitInterrupt() Install Interrupt")) );
v_EmulServDevice->InterruptMask = 0xffffffff; // Unmask all interrupts
}
VOID
UninstallInterrupt()
{
DEBUGMSG( TRUE, (TEXT("EmulatorServices:InitInterrupt() Uninstall Interrupt")) );
v_EmulServDevice->InterruptMask = 0;
}
/*------------------------------------------------------------------
EMS_Init
Standard stream interface Init function. Does nothing here.
------------------------------------------------------------------*/
DWORD
EMS_Init( DWORD /*registryPath*/ )
{
return 1;
}
/*------------------------------------------------------------------
EMS_Deinit
Standard stream interface Deinit function. Does nothing here.
------------------------------------------------------------------*/
BOOL
EMS_Deinit( DWORD /*dwData*/ )
{
return TRUE;
}
/*------------------------------------------------------------------
EMS_Open
Standard stream interface Open function. Does nothing here.
------------------------------------------------------------------*/
extern "C" DWORD
EMS_Open( DWORD /*dwData*/,
DWORD /*access*/,
DWORD /*shareMode*/ )
{
return 0;
}
/*------------------------------------------------------------------
EMS_Close
Standard stream interface Close function. Does nothing here.
------------------------------------------------------------------*/
BOOL
EMS_Close( DWORD /*dwData*/ )
{
return TRUE;
}
/*------------------------------------------------------------------
EMS_Write
Standard stream interface Write function. Does nothing here.
------------------------------------------------------------------*/
DWORD
EMS_Write( DWORD /*dwData*/,
LPCVOID /*writeBytes*/,
DWORD /*numBytes*/ )
{
return 0;
}
/*------------------------------------------------------------------
EMS_Read
Standard stream interface Read function. Does nothing here.
------------------------------------------------------------------*/
DWORD
EMS_Read( DWORD /*dwData*/,
LPVOID /*buffer*/,
DWORD /*numRead*/ )
{
return 0;
}
/*------------------------------------------------------------------
EMS_IOControl
Standard stream interface IOControl function. Does nothing here.
------------------------------------------------------------------*/
extern "C" BOOL
EMS_IOControl( DWORD /*dwData*/,
DWORD /*code*/,
PBYTE /*inBuf*/,
DWORD /*inLength*/,
DWORD /*outLength*/,
PBYTE /*outBuf*/,
PDWORD /*actualOut*/ )
{
return FALSE;
}
/*------------------------------------------------------------------
EMS_PowerUp
Standard stream interface PowerUp function. Does nothing here.
------------------------------------------------------------------*/
extern "C" void
EMS_PowerUp( DWORD /*hContext*/ )
{
// do nothing
}
/*------------------------------------------------------------------
EMS_PowerDown
Standard stream interface PowerDown function. Does nothing here.
------------------------------------------------------------------*/
extern "C" void
EMS_PowerDown( DWORD /*hContext*/ )
{
// do nothing
}
/*------------------------------------------------------------------
EMS_Seek
Standard stream interface Seek function. Does nothing here.
------------------------------------------------------------------*/
extern "C" DWORD
EMS_Seek( DWORD /*hOpenContext*/,
long /*amount*/,
WORD /*type*/ )
{
// Do nothing, return fail
return -1;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
DWORD DSK_Init(DWORD dwContext)
{
return 1;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
DWORD
DSK_Open(
DWORD dwData,
DWORD dwAccess,
DWORD dwShareMode
)
{
return 1;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
BOOL DSK_DeinitClose(DWORD dwContext)
{
return TRUE;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
DWORD DSK_Dud(DWORD dwData,DWORD dwAccess,DWORD dwShareMode)
{
return dwData;
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
void DSK_Power(void)
{
}
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
BOOL
DSK_IOControl(
DWORD Handle,
DWORD dwIoControlCode,
PBYTE pInBuf,
DWORD nInBufSize,
PBYTE pOutBuf,
DWORD nOutBufSize,
PDWORD pBytesReturned
)
{
BOOL initted = (BOOL)Handle;
DEBUGMSG( TRUE, (TEXT("Emulator Services: +DSK_IOControl\n")) );
if( !initted )
{
SetLastError(ERROR_INVALID_HANDLE);
DEBUGMSG(TRUE, (TEXT("-DSK_IOControl (invalid disk) \r\n")));
return FALSE;
}
//
// Check parameters
//
switch (dwIoControlCode)
{
case DISK_IOCTL_GETINFO:
if (pInBuf == NULL) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
break;
case IOCTL_DISK_DEVICE_INFO:
if(!pInBuf || nInBufSize != sizeof(STORAGEDEVICEINFO)) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
break;
default:
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
//
// Execute dwIoControlCode
//
switch (dwIoControlCode)
{
case DISK_IOCTL_GETINFO:
SetLastError(GetDiskInfo((PDISK_INFO)pInBuf));
DEBUGMSG( TRUE, (TEXT("Emulator Services: -DSK_IOControl:DISK_IOCTL_GETINFO\n")) );
return TRUE;
case IOCTL_DISK_DEVICE_INFO: // new ioctl for disk info
DEBUGMSG( TRUE, (TEXT("Emulator Services: -DSK_IOControl:IOCTL_DISK_DEVICE_INFO\n")) );
return GetDeviceInfo((PSTORAGEDEVICEINFO)pInBuf);
default:
DEBUGMSG( TRUE, (TEXT("Emulator Services: -DSK_IOControl:default\n")) );
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
} // DSK_IOControl
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
DWORD GetDiskInfo( PDISK_INFO pInfo )
{
pInfo->di_flags = 0;
return ERROR_SUCCESS;
} // GetDiskInfo
//------------------------------------------------------------------------
//
//------------------------------------------------------------------------
BOOL GetDeviceInfo(PSTORAGEDEVICEINFO pInfo)
{
BOOL fRet = FALSE;
if( pInfo )
{
_tcsncpy(pInfo->szProfile, VCEFSD_PROFILE, PROFILENAMESIZE);
// set our class, type, and flags
pInfo->dwDeviceClass = STORAGE_DEVICE_CLASS_MULTIMEDIA;
pInfo->dwDeviceType = STORAGE_DEVICE_TYPE_UNKNOWN;
pInfo->dwDeviceFlags = STORAGE_DEVICE_FLAG_READWRITE;
fRet = TRUE;
}
return fRet;
}
/*==================================================================
Change History (most recent first):
$Log: emulserv.cpp,v $
==================================================================*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -