void plateau_realiser_capture(SPlateau* plateau, SChaines* chaines, SChaine* chaine) { if(chaine) { SList* list = listEnsembleColore(chaine); listHead(list); do { SPosition* pos = listCurrent(list); plateau_set(plateau, pos, VIDE); }while(listNext(list)); //listDelete(list); listRemoveElement(chaines, chaine); //free(chaine); } }
/** * Process session event * * This service implements the OS independent API for processing equests * sent from the environment. Under Windows, this service would process * DEBUG_EVENTs when called from the operating system. Under the NDBG * executive debugger server, these events would be sent over a PIPE. * * This method calls the environment independent session event procedure. * * \param session Debug session * \param e Output DEBUG_EVENT descriptor * \ret Session state */ dbgSessionState DbgSessionProcessEvent (dbgSession* session, DEBUG_EVENT* e) { /* clear event descriptor */ dbgEventDescr descr; memset (&descr,0,sizeof(dbgEventDescr)); /* process debug event */ switch (e->dwDebugEventCode) { /* Create process */ case CREATE_PROCESS_DEBUG_EVENT: { unsigned long long base = 0; dbgCreateProcessDescr* record; record = &descr.u.createProcess; descr.event = DBG_EVENT_CREATEPROCESS; record->entry = (vaddr_t) e->u.CreateProcessInfo.lpStartAddress; record->imageBase = (vaddr_t) e->u.CreateProcessInfo.lpBaseOfImage; record->imageName = (vaddr_t) e->u.CreateProcessInfo.lpImageName; return session->proc (session, &descr); } /* Create thread */ case CREATE_THREAD_DEBUG_EVENT: { dbgCreateThreadDescr* record; record = &descr.u.createThread; descr.event = DBG_EVENT_CREATETHREAD; record->entry = (vaddr_t) e->u.CreateThread.lpStartAddress; return session->proc (session, &descr); } /* Exception */ case EXCEPTION_DEBUG_EVENT: { dbgExceptionDescr* record; record = &descr.u.exception; record->firstChance = e->u.Exception.dwFirstChance; descr.event = DBG_EVENT_EXCEPTION; /* Converts Windows exception code to internal format */ switch (e->u.Exception.ExceptionRecord.ExceptionCode) { case EXCEPTION_ACCESS_VIOLATION: descr.u.exception.code = DBG_EXCEPTION_SEGMENT; break; case EXCEPTION_ARRAY_BOUNDS_EXCEEDED: descr.u.exception.code = DBG_EXCEPTION_BOUNDS; break; case EXCEPTION_BREAKPOINT: descr.u.exception.code = DBG_EXCEPTION_BREAKPOINT; break; case EXCEPTION_DATATYPE_MISALIGNMENT: descr.u.exception.code = DBG_EXCEPTION_ALIGNMENT; break; case EXCEPTION_FLT_DENORMAL_OPERAND: descr.u.exception.code = DBG_EXCEPTION_FLT_DENORMAL_OPERAND; break; case EXCEPTION_FLT_DIVIDE_BY_ZERO: descr.u.exception.code = DBG_EXCEPTION_FLT_DIVIDE; break; case EXCEPTION_FLT_INEXACT_RESULT: descr.u.exception.code = DBG_EXCEPTION_FLT_INEXACT_RESULT; break; case EXCEPTION_FLT_INVALID_OPERATION: descr.u.exception.code = DBG_EXCEPTION_FLT_INVALID_OP; break; case EXCEPTION_FLT_OVERFLOW: descr.u.exception.code = DBG_EXCEPTION_FLT_OVERFLOW; break; case EXCEPTION_FLT_STACK_CHECK: descr.u.exception.code = DBG_EXCEPTION_FLT_STACK_CHECK; break; case EXCEPTION_FLT_UNDERFLOW: descr.u.exception.code = DBG_EXCEPTION_FLT_UNDERFLOW; break; case EXCEPTION_ILLEGAL_INSTRUCTION: descr.u.exception.code = DBG_EXCEPTION_INVALID_OPCODE; break; case EXCEPTION_INT_DIVIDE_BY_ZERO: descr.u.exception.code = DBG_EXCEPTION_INT_DIVIDE; break; case EXCEPTION_INT_OVERFLOW: descr.u.exception.code = DBG_EXCEPTION_INT_OVERFLOW; break; case EXCEPTION_SINGLE_STEP: descr.u.exception.code = DBG_EXCEPTION_SINGLE_STEP; break; case EXCEPTION_STACK_OVERFLOW: descr.u.exception.code = DBG_EXCEPTION_STACK; break; case EXCEPTION_IN_PAGE_ERROR: case EXCEPTION_INVALID_DISPOSITION: case EXCEPTION_NONCONTINUABLE_EXCEPTION: case EXCEPTION_PRIV_INSTRUCTION: descr.u.exception.code = DBG_EXCEPTION_GPF; break; case DBG_CONTROL_C: printf ("\n\rCtrl+c event not currently implemented."); break; } record->address = (vaddr_t) e->u.Exception.ExceptionRecord.ExceptionAddress; return session->proc (session, &descr); } /* Exit process */ case EXIT_PROCESS_DEBUG_EVENT: { dbgExitProcessDescr* record; record = &descr.u.exitProcess; descr.event = DBG_EVENT_EXITPROCESS; record->exitCode = e->u.ExitProcess.dwExitCode; return session->proc (session, &descr); } /* Exit thread */ case EXIT_THREAD_DEBUG_EVENT: { dbgExitThreadDescr* record; record = &descr.u.exitThread; descr.event = DBG_EVENT_EXITTHREAD; record->exitCode = e->u.ExitThread.dwExitCode; return session->proc (session, &descr); } /* Output string */ case OUTPUT_DEBUG_STRING_EVENT: { dbgDebugStringDescr* record; char* str = 0; dbgSessionState state = DBG_STATE_CONTINUE; /* create record */ record = &descr.u.debugString; descr.event = DBG_EVENT_PRINT; record->length = e->u.DebugString.nDebugStringLength; /* string located in process address space so we buffer it */ str = (char*)malloc(record->length); DbgProcessRequest (DBG_REQ_READ,session, e->u.DebugString.lpDebugStringData,str,record->length); record->string = (vaddr_t) str; str[record->length-1] = 0; /* 0 terminate */ /* process event and release memory */ state = session->proc (session, &descr); free(str); return state; } /* The following events are processed internally and are not passed to the core debugger. They are Windows specific events. */ /* Load DLL */ case LOAD_DLL_DEBUG_EVENT: { dbgSharedLibrary* libraryDescr; char path[64]; memset (path,0,64); /* lpImageName is a pointer in the process address space that contains a pointer to the real string in that address space. */ if (e->u.LoadDll.lpImageName) { vaddr_t imageName = 0; DbgProcessRequest (DBG_REQ_READ,session, e->u.LoadDll.lpImageName,&imageName,4); if (imageName) { wchar_t image[128]; memset (image,128,0); DbgProcessRequest (DBG_REQ_READ,session,(void*)imageName,image,127); #ifdef _MSC_VER { size_t numConverted = 0; wcstombs_s (&numConverted, path, 64, image,63); } #else wcstombs (path,image,63); #endif } } /* there is no debug event for this since its Windows specific */ DbgDisplayMessage ("(%i) Loaded '%s'", session->process.id.pid, path); break; } /* RIP Event */ case RIP_EVENT: { /* there is no debug event for this since its Windows specific */ DbgDisplayMessage ("RIP Event"); break; } /* Unload DLL */ case UNLOAD_DLL_DEBUG_EVENT: { /* Locate library object */ dbgSharedLibrary* descr = 0; listNode* cur = session->process.libraryList.first; size_t c; for (c = 0; c < session->process.libraryList.count; c++) { descr = (dbgSharedLibrary*) cur->data; if (descr->base == (vaddr_t) e->u.UnloadDll.lpBaseOfDll) break; cur = cur->next; } /* Display library and unload it */ if (cur) { DbgDisplayMessage("(%i) Unloaded '%s'", session->process.id.pid, descr->name); free (descr->name); listRemoveElement(c, &session->process.libraryList); } else DbgDisplayMessage ("(%i) Unloaded unknown DLL", session->process.id.pid); /* there is no debug event for this since its Windows specific */ break; } } /* we just continue this session for all events that dont need processing */ return DBG_STATE_CONTINUE; }