📄 memory.cpp
字号:
// Make sure outputs exist
if (pOutputInfo->dwOutputHead != pOutputInfo->dwOutputTail)
{
// jump to the head
pOutputArea += dwOutputNumber;
// check for block not in use
if (pOutputArea->bInUse)
{
// copy to return value
memcpy(pOutput, pOutputArea, sizeof(OUTPUT_DESC));
// if this block is also the head, update the head
if (dwOutputNumber == pOutputInfo->dwOutputHead)
{
pOutputInfo->dwOutputHead = (pOutputInfo->dwOutputHead + 1) %
(m_pOutputArea->GetCurrentSize() / sizeof(OUTPUT_DESC));
}
else if (dwOutputNumber == pOutputInfo->dwOutputTail)
{
if (pOutputInfo->dwOutputTail == 0)
{
pOutputInfo->dwOutputTail = (m_pOutputArea->GetCurrentSize() / sizeof(OUTPUT_DESC));
}
else
{
pOutputInfo->dwOutputTail--;
}
}
pOutputArea->bInUse = BLOCK_FREE;
}
else
{
dwStatus = ERROR_INVALID_BLOCK;
}
}
else
{
dwStatus = ERROR_NO_MORE_ITEMS;
}
}
__except(MemoryExcFilter(GetExceptionInformation(),OUTPUT_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_hOutputLock);
return(dwStatus);
}
LETGO(m_hOutputLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of elements in the output queue
//
// @parm None
//
// @rvalue ERROR_SUCCESS | If successful
//
EXPORT32 DWORD CCommonMemory::GetOutputCount(OUT DWORD *dwCurrentSize)
{
DWORD dwStatus = ERROR_SUCCESS;
// get a pointer to the Output area
// first part of output area is the information part containing
// the head and tail, and statistics
OUTPUT_INFO *pOutputInfo;// = (OUTPUT_INFO *)m_pOutputArea->GetAddress();
OUTPUT_DESC *pOutputArea;// = (OUTPUT_DESC *)(pOutputInfo + 1);
// Check for a NULL pointer
if (NULL == dwCurrentSize)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hOutputLock);
pOutputInfo = (OUTPUT_INFO *)m_pOutputArea->GetAddress();
pOutputArea = (OUTPUT_DESC *)(pOutputInfo + 1);
__try
{
// if the tail is greater than the head, no overlap
// is in effect
if (pOutputInfo->dwOutputTail > pOutputInfo->dwOutputHead)
{
*dwCurrentSize = pOutputInfo->dwOutputTail - pOutputInfo->dwOutputHead;
}
else
{
// calculate head to end
*dwCurrentSize = (m_pOutputArea->GetCurrentSize() /
sizeof(OUTPUT_DESC)) - pOutputInfo->dwOutputHead;
// add in tail
*dwCurrentSize += pOutputInfo->dwOutputTail;
}
}
__except(MemoryExcFilter(GetExceptionInformation(),OUTPUT_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_hOutputLock);
return(dwStatus);
}
LETGO(m_hOutputLock);
return(ERROR_SUCCESS);
}
//
// Start of Exception Area access functions
//
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function adds an Exception to the Exception queue
//
// @parm IN LPVOID | pException | Pointer to Exception information
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
//
EXPORT32 LONG CCommonMemory::AddException(IN LPVOID pException)
{
// get a pointer to the Exception area
// first part of Exception area is the information part containing
// the head and tail, and statistics
EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
DWORD dwCurrentSize,
dwStatus = ERROR_SUCCESS;
// Check for a NULL po
if (NULL == pException)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hExceptionLock);
pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);
__try
{
DWORD dwTempTail;
// jump to the tail, make sure to jump passed info at beginning
pExceptionArea += pExceptionInfo->dwExceptionTail;
// Check if this will cause an overrun
if (m_pExceptionArea->GetCurrentSize() == 0)
dwTempTail = 1;
else
dwTempTail = (pExceptionInfo->dwExceptionTail + 1) %
(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
if (dwTempTail == pExceptionInfo->dwExceptionHead)
{
// Do overrun stuff
memcpy((CHAR *)m_pExceptionArea->GetAddress() + m_pExceptionArea->GetCurrentSize(),
m_pExceptionArea->GetAddress(),
pExceptionInfo->dwExceptionTail * sizeof(EXCEPTION_DESC));
dwTempTail = (pExceptionInfo->dwExceptionTail + 1) %
(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
}
// now add our new Exception at the tail
memcpy(pExceptionArea, pException, sizeof(EXCEPTION_DESC));
// update the tail pointer
pExceptionInfo->dwExceptionTail = dwTempTail;
pExceptionArea->bInUse = BLOCK_INUSE;
}
__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_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_hExceptionLock);
return(dwStatus);
}
// keep track of statistics on this area
// if the tail is greater than the head, no overlap
// is in effect
if (pExceptionInfo->dwExceptionTail > pExceptionInfo->dwExceptionHead)
{
dwCurrentSize = pExceptionInfo->dwExceptionTail - pExceptionInfo->dwExceptionHead;
}
else
{
// calculate head to end
dwCurrentSize = (m_pExceptionArea->GetCurrentSize() /
sizeof(EXCEPTION_DESC)) - pExceptionInfo->dwExceptionHead;
// add in tail
dwCurrentSize += pExceptionInfo->dwExceptionTail;
}
if (pExceptionInfo->dwMaxNumExceptions <= dwCurrentSize)
pExceptionInfo->dwMaxNumExceptions = dwCurrentSize;
LETGO(m_hExceptionLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Removes an Exception from the Exception queue
//
// @parm IN LPVOID | pException | Pointer to Exception information
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_NO_MORE_ITEMS | if no Exceptions in queue
//
EXPORT32 LONG CCommonMemory::GetExceptionHead(OUT LPVOID pException)
{
// get a pointer to the Exception area
// first part of Exception area is the information part containing
// the head and tail, and statistics
EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
DWORD dwStatus = ERROR_SUCCESS;
// Check for a NULL pointer
if (NULL == pException)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hExceptionLock);
pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);
__try
{
// Make sure Exceptions exist
if (pExceptionInfo->dwExceptionHead != pExceptionInfo->dwExceptionTail)
{
// XXXX need to check for block not in use....
// jump to the head
pExceptionArea += pExceptionInfo->dwExceptionHead;
// copy to return value
memcpy(pException, pExceptionArea, sizeof(EXCEPTION_DESC));
// update the head
pExceptionInfo->dwExceptionHead = (pExceptionInfo->dwExceptionHead + 1) %
(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
pExceptionArea->bInUse = BLOCK_FREE;
// for performance reasons, if the head and tail are the same, go back to beginning
// of memory so that the increment to correct location is less
if (pExceptionInfo->dwExceptionHead == pExceptionInfo->dwExceptionTail)
pExceptionInfo->dwExceptionHead = pExceptionInfo->dwExceptionTail = 1;
}
else
{
dwStatus = ERROR_NO_MORE_ITEMS;
}
}
__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_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_hExceptionLock);
return(dwStatus);
}
LETGO(m_hExceptionLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function Removes a specific Exception from a the Exception queue
//
// @parm IN LPVOID | pException | Pointer to Exception information
//
// @parm IN DWORD | dwExceptionNumber | Exception to retrieve
//
// @rvalue ERROR_SUCCESS | If successful
//
// @rvalue ERROR_INVALID_BLOCK | If block not in use
//
// @rvalue ERROR_NO_MORE_ITEMS | if no Exceptions in queue
//
EXPORT32 LONG CCommonMemory::GetExceptionAt(OUT LPVOID pException,
IN DWORD dwExceptionNumber)
{
// get a pointer to the Exception area
// first part of Exception area is the information part containing
// the head and tail, and statistics
EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
DWORD dwStatus = ERROR_SUCCESS;
// Check for a NULL pointer
if (NULL == pException)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hExceptionLock);
pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);
__try
{
// Make sure Exceptions exist
if (pExceptionInfo->dwExceptionHead != pExceptionInfo->dwExceptionTail)
{
// jump to the head
pExceptionArea += dwExceptionNumber;
// check for block not in use
if (pExceptionArea->bInUse)
{
// copy to return value
memcpy(pException, pExceptionArea, sizeof(EXCEPTION_DESC));
// if this block is also the head, update the head
if (dwExceptionNumber == pExceptionInfo->dwExceptionHead)
{
pExceptionInfo->dwExceptionHead = (pExceptionInfo->dwExceptionHead + 1) %
(m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
}
else if (dwExceptionNumber == pExceptionInfo->dwExceptionTail)
{
if (pExceptionInfo->dwExceptionTail == 0)
{
pExceptionInfo->dwExceptionTail = (m_pExceptionArea->GetCurrentSize() / sizeof(EXCEPTION_DESC));
}
else
{
pExceptionInfo->dwExceptionTail--;
}
}
pExceptionArea->bInUse = BLOCK_FREE;
}
else
{
dwStatus = ERROR_INVALID_BLOCK;
}
}
else
{
dwStatus = ERROR_NO_MORE_ITEMS;
}
}
__except(MemoryExcFilter(GetExceptionInformation(),EXCEPTION_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_hExceptionLock);
return(dwStatus);
}
LETGO(m_hExceptionLock);
return(dwStatus);
}
//----(Member Function)-------------------------------------------------------
//
// @mfunc This function returns the number of elements in the Exception queue
//
// @parm None
//
// @rvalue ERROR_SUCCESS | If successful
//
EXPORT32 DWORD CCommonMemory::GetExceptionCount(OUT DWORD *dwCurrentSize)
{
DWORD dwStatus = ERROR_SUCCESS;
// get a pointer to the Exception area
// first part of Exception area is the information part containing
// the head and tail, and statistics
EXCEPTION_INFO *pExceptionInfo;// = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
EXCEPTION_DESC *pExceptionArea;// = (EXCEPTION_DESC *)(pExceptionInfo + 1);
// Check for a NULL pointer
if (NULL == dwCurrentSize)
return(ERROR_INVALID_PARAMETER);
WAITFOR(m_hExceptionLock);
pExceptionInfo = (EXCEPTION_INFO *)m_pExceptionArea->GetAddress();
pExceptionArea = (EXCEPTION_DESC *)(pExceptionInfo + 1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -