示例#1
0
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);
	}
}
示例#2
0
文件: session.c 项目: mwt5175/ndbg
/**
*	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;
}