#include "precomp.h" PXFER_LIST CreateXferList( VOID ) { PXFER_LIST XferList; XferList=(PXFER_LIST)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(*XferList)); if (XferList == NULL) { return NULL; } ZeroMemory(XferList,sizeof(XferList)); XferList->CloseEvent=CreateEvent(NULL,TRUE,FALSE,NULL); if (XferList->CloseEvent == NULL) { HeapFree(GetProcessHeap(),0,XferList); return NULL; } _try { InitializeCriticalSection( &XferList->Lock ); } _except(EXCEPTION_EXECUTE_HANDLER) { CloseHandle(XferList->CloseEvent); HeapFree(GetProcessHeap(),0,XferList); return NULL; } return XferList; } VOID DeleteXferList( PXFER_LIST XferList ) { ULONG i; EnterCriticalSection(&XferList->Lock); XferList->Closing=TRUE; for (i=0; iList[i] != NULL) { XferList->List[i]->StopListening(); } } if (XferList->Transfers == 0 ) { SetEvent(XferList->CloseEvent); } LeaveCriticalSection(&XferList->Lock); WaitForSingleObject(XferList->CloseEvent,INFINITE); CloseHandle(XferList->CloseEvent); DeleteCriticalSection( &XferList->Lock ); HeapFree(GetProcessHeap(),0,XferList); return; } BOOL AddTransferToList( PXFER_LIST XferList, FILE_TRANSFER* FileTransfer ) { ULONG i; BOOL bReturn=FALSE; EnterCriticalSection(&XferList->Lock); if (!XferList->Closing) { for (i=0; iList[i] == NULL) { XferList->List[i]=FileTransfer; InterlockedIncrement(&XferList->Transfers); bReturn=TRUE; break; } } } LeaveCriticalSection(&XferList->Lock); return bReturn; } BOOL RemoveTransferFromList( PXFER_LIST XferList, FILE_TRANSFER* FileTransfer ) { ULONG i; BOOL bReturn=FALSE; LONG Count; EnterCriticalSection(&XferList->Lock); for (i=0; iList[i] == FileTransfer) { XferList->List[i]=NULL; Count=InterlockedDecrement(&XferList->Transfers); bReturn=TRUE; break; } } if (bReturn) { // // found the transfer in the list // if ((Count == 0) && (XferList->Closing)) { SetEvent(XferList->CloseEvent); } } else { // // where did the transfer go? // ASSERT(0); } LeaveCriticalSection(&XferList->Lock); return TRUE; } BOOL AreThereActiveTransfers( PXFER_LIST XferList ) { ULONG i; BOOL bReturn=FALSE; EnterCriticalSection(&XferList->Lock); for (i=0; iList[i] != NULL) { if (XferList->List[i]->IsActive()) { bReturn=TRUE; break; } } } LeaveCriticalSection(&XferList->Lock); return bReturn; } FILE_TRANSFER* TransferFromCookie( PXFER_LIST XferList, __int64 Cookie ) { ULONG i; BOOL bReturn=FALSE; FILE_TRANSFER* Transfer=NULL; EnterCriticalSection(&XferList->Lock); for (i=0; iList[i] != NULL) { if (XferList->List[i]->GetCookie() == Cookie) { Transfer=XferList->List[i]; break; } } } #if DBG if (Transfer == NULL) { DbgPrint("IRMON: TransferFromCookie: could not find cookie\n"); } #endif LeaveCriticalSection(&XferList->Lock); return Transfer; }