📄 memory.cpp
字号:
OUT LPVOID pData,
IN OPTIONAL WORD wOffset,
IN OPTIONAL BOOL bIgnoreBytesInUse)
{
// get a pointer to the list of blocks
DATA_AREA_LINK *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
char *pDataArea;// = (char *)m_pDataArea->GetAddress();
DWORD dwStatus = ERROR_SUCCESS;
// Check for a NULL pointer
if (NULL == pData)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hDataLock);
pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
pDataArea = (char *)m_pDataArea->GetAddress();
__try
{
// jump to the requested block
pBlockLink += wBlockNumber;
if ((pBlockLink->bInUse == BLOCK_FREE) ||
(pBlockLink->wBlockSize < wNumBytes) ||
(pBlockLink->wBlockSize < wNumBytes + wOffset))
{
dwStatus = ERROR_INVALID_BLOCK;
}
else if (((pBlockLink->wBytesInUse < wNumBytes) ||
(pBlockLink->wBytesInUse < wNumBytes + wOffset)) &&
(FALSE == bIgnoreBytesInUse))
{
dwStatus = ERROR_NOT_ENOUGH_MEMORY;
}
else
{
// Copy the data
__try
{
pDataArea += (pBlockLink->dwBlockOffset + wOffset);
memcpy(pData, pDataArea, wNumBytes);
}
__except(MemoryExcFilter(GetExceptionInformation(),DATA_AREA))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
}
}
__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
LETGO(m_hDataLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Sets a block of real time data
//
// @parm IN WORD | wBlockNumber | Number of block to access
//
// @parm IN WORD | wNumBytes | Number of bytes to Set
//
// @parm OUT LPVOID | pData | Buffer holding data
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_INVALID_BLOCK_LENGTH | if wNumBytes is greater than block size
//
EXPORT32 DWORD CCommonMemory::SetDataBlock(IN WORD wBlockNumber,
IN WORD wNumBytes,
IN LPVOID pData,
IN OPTIONAL WORD wOffset)
{
// get a pointer to the list of blocks
DATA_AREA_LINK *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
char *pDataArea;// = (char *)m_pDataArea->GetAddress();
DWORD dwStatus = ERROR_SUCCESS;
// Check for a NULL pointer
if (NULL == pData)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hDataLock);
pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
pDataArea = (char *)m_pDataArea->GetAddress();
__try
{
// jump to the requested block
pBlockLink += wBlockNumber;
if ((pBlockLink->bInUse == BLOCK_FREE) ||
(pBlockLink->wBlockSize < wNumBytes) ||
(pBlockLink->wBlockSize < wNumBytes + wOffset))
{
dwStatus = ERROR_INVALID_BLOCK;
}
else
{
__try
{
pDataArea += (pBlockLink->dwBlockOffset + wOffset);
memcpy(pDataArea, pData, wNumBytes);
dwStatus = ERROR_SUCCESS;
}
__except(MemoryExcFilter(GetExceptionInformation(),DATA_AREA))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
}
}
__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
LETGO(m_hDataLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of Data Blocks
//
// @parm None
//
// @rvalue Number of Data Blocks
//
EXPORT32 DWORD CCommonMemory::GetDataBlockCount(void)
{
return(m_pBlockList->GetElements());
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the current size of the data block, and Link area
//
// @parm None
//
// @rvalue Size of Data block area
//
EXPORT32 void CCommonMemory::GetDataBlockSize(OUT OPTIONAL DWORD *dwDataSize,
OUT OPTIONAL DWORD *dwListSize)
{
if (dwListSize != NULL)
*dwListSize = m_pBlockList->GetCurrentSize();
if (dwDataSize != NULL)
*dwDataSize = m_pDataArea->GetCurrentSize();
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the current status of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm OUT WORD * | pStatus | Status of the data
// @parm OUT OPTIONAL DWORD * | pDataBlockHandle | Handle of owning DataBlock
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::GetDataBlockStatus(IN WORD wBlockNumber, OUT WORD *pStatus,
OUT OPTIONAL DWORD *pDataBlockHandle /* = NULL */)
{
// get a pointer to the list of blocks
DATA_AREA_LINK *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
DWORD dwStatus = ERROR_SUCCESS;
WAITFOR(m_hDataLock);
pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
__try
{
// jump to the requested block
pBlockLink += wBlockNumber;
if (pBlockLink->bInUse == BLOCK_FREE)
{
dwStatus = ERROR_INVALID_BLOCK;
}
else
{
// Get the data
__try
{
*pStatus = pBlockLink->wDataStatus;
// if requested, also return the datablock handle
if (NULL != pDataBlockHandle)
*pDataBlockHandle = pBlockLink->dwDataBlockHandle;
}
__except(MemoryExcFilter(GetExceptionInformation(),DATA_AREA))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
}
}
__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
LETGO(m_hDataLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function sets the current status of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm IN WORD | wStatus | New Status of the data
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::SetDataBlockStatus(IN WORD wBlockNumber, IN WORD wStatus)
{
// get a pointer to the list of blocks
DATA_AREA_LINK *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
DWORD dwStatus = ERROR_SUCCESS;
WAITFOR(m_hDataLock);
pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
__try
{
// jump to the requested block
pBlockLink += wBlockNumber;
if (pBlockLink->bInUse == BLOCK_FREE)
{
dwStatus = ERROR_INVALID_BLOCK;
}
else
{
// Set the data
__try
{
pBlockLink->wDataStatus = wStatus;
}
__except(MemoryExcFilter(GetExceptionInformation(),DATA_AREA))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
}
}
__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
LETGO(m_hDataLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the NIO Access state of the data block
//
// @parm IN WORD | wBlockNumber| Block number to return information for
// @parm OUT WORD * | pState | NIO Access state
// @parm IN BOOL | bReset | Set to zero after reading if set to TRUE
//
// @rvalue ERROR_SUCCESS | If successful
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
EXPORT32 DWORD CCommonMemory::GetNIOAccess(IN WORD wBlockNumber, OUT BOOL *pState, IN BOOL bReset)
{
// get a pointer to the list of blocks
DATA_AREA_LINK *pBlockLink;// = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
DWORD dwStatus = ERROR_SUCCESS;
WAITFOR(m_hDataLock);
pBlockLink = (DATA_AREA_LINK *)m_pBlockList->GetAddress();
__try
{
// jump to the requested block
pBlockLink += wBlockNumber;
if (pBlockLink->bInUse == BLOCK_FREE)
{
dwStatus = ERROR_INVALID_BLOCK;
}
else
{
// Get the data
__try
{
*pState = pBlockLink->bNIOAccess;
if (TRUE == bReset)
pBlockLink->bNIOAccess = FALSE;
}
__except(MemoryExcFilter(GetExceptionInformation(),DATA_AREA))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
}
}
__except(MemoryExcFilter(GetExceptionInformation(),BLOCK_LIST))
{
dwStatus = GetExceptionCode();
switch (dwStatus)
{
case EXCEPTION_GMMF_DISKFULL: dwStatus = MEM_DISKFULL; break;
case EXCEPTION_GMMF_CORRUPTEDRGN: dwStatus = MEM_CORRUPT; break;
case EXCEPTION_GMMF_WRITEPAST: dwStatus = MEM_WRITEPAST; break;
default: dwStatus = MEM_UNKNOWN; break;
}
LETGO(m_hDataLock);
return(dwStatus);
}
LETGO(m_hDataLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -