📄 freeotfe4pdacontextmgropen.c
字号:
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: +) ---OL ...Done.\n")));
}
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: +) AQ-4\n"), hDevice));
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("(OH: +) contextMgrOpen_AddOpenContext\n"), hDevice));
return retval;
}
// =========================================================================
// This function removes the device indicated from the list of devices, and
// returns the device context of the device for the *caller* to overwrite
// and destroy
void contextMgrOpen_DeleteOpenContext(DWORD hOpen)
{
OPEN_LIST_ITEM* currListItem = NULL;
OPEN_LIST_ITEM* prevListItem = NULL;
BOOL gotListCriticalSection;
BOOL gotListItemCriticalSection;
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("(OH: %d) contextMgrOpen_DeleteOpenContext\n"), hOpen));
if (!(G_contextMgrOpenInitialized))
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("(OH: %d) Device mgr list not initialized\n"), hOpen));
}
else
{
if (G_contextMgrForceDismounts)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) EMERGENCY.\n"), hOpen));
}
else
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) Not an emergency.\n"), hOpen));
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-1\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) +++OL About to...\n"), hOpen));
if (G_contextMgrForceDismounts)
{
gotListCriticalSection = TryEnterCriticalSection(&G_contextMgrOpenCriticalSection);
}
else
{
EnterCriticalSection(&G_contextMgrOpenCriticalSection);
gotListCriticalSection = TRUE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) +++OL ...Done..\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-2\n"), hOpen));
currListItem = G_contextMgrOpenDeviceList;
prevListItem = NULL;
while (currListItem != NULL)
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-3.\n"), hOpen));
if (currListItem->hOpen == hOpen)
{
// Unlink from list
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) Unlinking from list...\n"), hOpen));
if (prevListItem == NULL)
{
G_contextMgrOpenDeviceList = currListItem->NextListItem;
}
else
{
prevListItem->NextListItem = currListItem->NextListItem;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) List item unlinked.\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) +++OI About to...\n"), hOpen));
if (G_contextMgrForceDismounts)
{
gotListItemCriticalSection = TryEnterCriticalSection(&(currListItem->CriticalSection));
}
else
{
EnterCriticalSection(&(currListItem->CriticalSection));
gotListItemCriticalSection = TRUE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) +++OI ...Done.\n"), hOpen));
currListItem->hOpen = 0;
currListItem->hDevice = 0;
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-3.3\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) ---OI About to...\n"), hOpen));
if (gotListItemCriticalSection)
{
LeaveCriticalSection(&(currListItem->CriticalSection));
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) ---OI ...Done.\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-3.4\n"), hOpen));
// Free off list item
DeleteCriticalSection(&(currListItem->CriticalSection));
SecZeroAndFreeMemory(currListItem, sizeof(currListItem));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-3.5\n"), hOpen));
break;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-4.\n"), hOpen));
prevListItem = currListItem;
currListItem = currListItem->NextListItem;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) AZ-5.\n"), hOpen));
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) ---OL About to...\n"), hOpen));
if (gotListCriticalSection)
{
LeaveCriticalSection(&G_contextMgrOpenCriticalSection);
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(OH: %d) ---OL ...Done.\n"), hOpen));
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("(OH: %d) contextMgrOpen_DeleteOpenContext\n"), hOpen));
}
// =========================================================================
DWORD contextMgrOpen_CountDeviceOpenContext(DWORD hDevice)
{
OPEN_LIST_ITEM* currListItem;
DWORD retval = 0;
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("(ODH: %d) contextMgrOpen_CountDeviceOpenContext\n"), hDevice));
if (!(G_contextMgrOpenInitialized))
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("(ODH: %d) Device mgr list not initialized\n"), hDevice));
}
else
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) +++OL About to...\n"), hDevice));
EnterCriticalSection(&G_contextMgrOpenCriticalSection);
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) +++OL ...Done.\n"), hDevice));
currListItem = G_contextMgrOpenDeviceList;
while (currListItem != NULL)
{
if (currListItem->hDevice == hDevice)
{
retval++;
}
currListItem = currListItem->NextListItem;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) ---OL About to...\n"), hDevice));
LeaveCriticalSection(&G_contextMgrOpenCriticalSection);
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) ---OL ...Done.\n"), hDevice));
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("(ODH: %d) contextMgrOpen_CountDeviceOpenContext\n"), hDevice));
return retval;
}
// =========================================================================
// Destroy all open handles for the specified device
void contextMgrOpen_DeleteDeviceOpenContext(DWORD hDevice)
{
OPEN_LIST_ITEM* currListItem;
OPEN_LIST_ITEM* nextListItem;
BOOL gotListCriticalSection;
DEBUGOUTMAINDRV(DEBUGLEV_ENTER, (TEXT("(ODH: %d) contextMgrOpen_DeleteDeviceOpenContext\n"), hDevice));
if (!(G_contextMgrOpenInitialized))
{
DEBUGOUTMAINDRV(DEBUGLEV_ERROR, (TEXT("(ODH: %d) Device mgr list not initialized\n"), hDevice));
}
else
{
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) +++OL About to...\n"), hDevice));
if (G_contextMgrForceDismounts)
{
gotListCriticalSection = TryEnterCriticalSection(&G_contextMgrOpenCriticalSection);
}
else
{
EnterCriticalSection(&G_contextMgrOpenCriticalSection);
gotListCriticalSection = TRUE;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) +++OL ...Done.\n"), hDevice));
currListItem = G_contextMgrOpenDeviceList;
while (currListItem != NULL)
{
// Store the next one on the list; otherwise this information will
// be overwritten if the current one is removed
nextListItem = currListItem->NextListItem;
if (currListItem->hDevice == hDevice)
{
// Note that even though
// contextMgrOpen_DeleteOpenContext(...) enters the list's
// critical section, this won't block as it's still the same
// thread as this function is called in
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) Calling contextMgrOpen_DeleteOpenContext...\n"), hDevice));
contextMgrOpen_DeleteOpenContext(currListItem->hOpen);
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) Finished calling contextMgrOpen_DeleteOpenContext\n"), hDevice));
}
currListItem = nextListItem;
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) ---OL About to...\n"), hDevice));
if (gotListCriticalSection)
{
LeaveCriticalSection(&G_contextMgrOpenCriticalSection);
}
DEBUGOUTMAINDRV(DEBUGLEV_INFO, (TEXT("(ODH: %d) ---OL ...Done.\n"), hDevice));
}
DEBUGOUTMAINDRV(DEBUGLEV_EXIT, (TEXT("(ODH: %d) contextMgrOpen_DeleteDeviceOpenContext\n"), hDevice));
}
// =========================================================================
// =========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -