Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
#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; i<MAX_TRANSFERS; i++) {
if (XferList->List[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; i<MAX_TRANSFERS; i++) {
if (XferList->List[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; i<MAX_TRANSFERS; i++) {
if (XferList->List[i] == FileTransfer) {
XferList->List[i]=NULL; Count=InterlockedDecrement(&XferList->Transfers); bReturn=TRUE; break; } }
if ((Count == 0) && (XferList->Closing)) {
SetEvent(XferList->CloseEvent); }
LeaveCriticalSection(&XferList->Lock);
return TRUE;
}
BOOL AreThereActiveTransfers( PXFER_LIST XferList )
{ ULONG i; BOOL bReturn=FALSE;
EnterCriticalSection(&XferList->Lock);
for (i=0; i<MAX_TRANSFERS; i++) {
if (XferList->List[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; i<MAX_TRANSFERS; i++) {
if (XferList->List[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;
}
|