Anuncios Google

[C]Ayuda con una modificacion de un programa avanzado

Hola amigos!!

El caso es que encontré un sample del sdk que actúa como escaner de redes.

Lo que pasa es que está estructurado en thread's o algo así. Busque algo en google pero me quedé como estaba.

Lo que quiero es hacer lo mismo que el sample pero en vez de usar un thread, llamar a una funcion que haga eso.

Eso es posible?

La parte que quiero modificar está en el main


/*
 * PSP Software Development Kit - http://www.pspdev.org
 * -----------------------------------------------------------------------
 * Licensed under the BSD license, see LICENSE in PSPSDK root for details.
 *
 * main.c - ELF Based WLAN Scanner
 *
 * Copyright (c) 2005 James F <tyranid [at] gmail [dot] com>
 *                    adresd
 *
 * $Id: main.c 1888 2006-05-01 08:47:04Z tyranid $
 * $HeadURL$
 */
#include <pspkernel.h>
#include <pspdebug.h>
#include <pspsdk.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pspnet.h>
#include <pspwlan.h>
#include <pspctrl.h>
#include <pspdisplay.h>
 
#define printf pspDebugScreenPrintf
 
#define MODULE_NAME "WlanScanner"
 
PSP_MODULE_INFO(MODULE_NAME, 0x1000, 1, 1);
PSP_MAIN_THREAD_ATTR(0);
 
/* Init the scan */
int sceNet_lib_5216CBF5(const char *name);
/* Do the scan */
int sceNet_lib_7BA3ED91(const char *name, void *type, u32 *size, void *buf, u32 *unk);
/* Terminate the scan */
int sceNet_lib_D2422E4D(const char *name);
 
#define InitScan sceNet_lib_5216CBF5
#define ScanAPs  sceNet_lib_7BA3ED91
#define TermScan sceNet_lib_D2422E4D
 
//Datos para el md5
unsigned char exbssid[30];
 
/* Global buffer to store the scan data */
unsigned char scan_data[0xA80];
 
/* DATOS BSSID Y DEMAS */
struct ScanData
{
	struct ScanHead *pNext; 
	unsigned char bssid[6]; 
	char channel; 
	unsigned char namesize; 
	char name[32]; 
	unsigned int bsstype; 
	unsigned int beaconperiod; 
	unsigned int dtimperiod; 
	unsigned int timestamp; 
	unsigned int localtime; 
	unsigned short atim; 
	unsigned short capabilities; 
	unsigned char  rate[8]; 
	unsigned short rssi; 
	unsigned char  sizepad[6]; 
} __attribute__((packed));
 
/* Capability flags *///DATOS ESCANEO
const char *caps[8] = {
	"ESS, ",
	"IBSS, ",
	"CF Pollable, ",
	"CF Pollreq,  ",
	"Privacy (WEP), ",
	"Short Preamble, ",
	"PBCC, ",
	"Channel Agility, "
};
 
/* Imprimiendo datos PeQUEÑOS */
void print_apsum(struct ScanData *pData)
{
	char name[33];
	int  loop;
	strncpy(name, pData->name, 32);
	name[32] = 0;
	printf("RSSI:%02d  ", pData->rssi);
	if (pData->capabilities & (1 << 4))
		printf(" WEP! ");
	else
		printf("FREE");
	printf("   SSID: %s\n", name);
}
 
/* Imprimiendo datos TOTALES */
void print_ap(struct ScanData *pData)//bssidex es el bssid pero será llevado a la funcion main
{
	char name[33];
	char bssid[30];	
	int  loop;
	strncpy(name, pData->name, 32);
	name[32] = 0;
	sceNetEtherNtostr(pData->bssid, bssid);
	sceNetEtherNtostr(pData->bssid, exbssid);
	printf("BSSID: %s\n", bssid);
	printf("SSID: %s\n", name);
	printf("bsstype: ");
	if(pData->bsstype == 1)
	{
		printf("Infrastructure\n");
	}
	else if(pData->bsstype == 2)
	{
		printf("Independent\n");
	}
	else
	{
		printf("Unknown\n");
	}
	printf("Beacon Period: %d\n", pData->beaconperiod);
	printf("DTIM period: %d\n", pData->dtimperiod);
	printf("Timestamp: %d\n", pData->timestamp);
	printf("Local Time: %d\n", pData->localtime);
	printf("Channel: %d\n", pData->channel);
	printf("ATIM: %d\n", pData->atim);
	printf("Capability Information: ");
	for(loop = 0; loop < 8; loop++)
	{
		if(pData->capabilities & (1 << loop))
		{
			printf("%s", caps[loop]);
		}
	}
	printf("\n");
 
	printf("Rate: ");
	for(loop = 0; loop < 8; loop++)
	{
		const char *type;
 
		if(pData->rate[loop] & 0x80)
		{
			type = "Basic";
		}
		else
		{
			type = "Operational";
		}
 
		if(pData->rate[loop] & 0x7F)
		{
			printf("%s %d kbps, ", type, (pData->rate[loop] & 0x7F) * 500);
		}
	}
	printf("\n");
 
	printf("RSSI: %d\n", pData->rssi);
 
	printf("\n");
}
 
/* Hacer un escaneo */
struct ScanData *do_scan(int *count)
{
	unsigned char type[0x4C];
	u32 size, unk;
	int i;
	int ret;
 
	if((ret = InitScan("wlan")) >= 0)
	{
		memset(type, 0, sizeof(type));
		/* Set the channels we want to scan */
		for(i = 1; i < 0xF; i++)
		{
			type[0x9+i] = i;
		}
		type[0x3C] = 1;
		*((u32*) (type + 0x44)) = 1;    //6/* Minimum strength */
		*((u32*) (type + 0x48)) = 100;  /* Maximum strength */
		size = sizeof(scan_data);
		unk  = 0;
		memset(scan_data, 0, sizeof(scan_data));
		ret = ScanAPs("wlan", type, &size, scan_data, &unk);
		if(ret < 0)
		{
			printf("Error, could not perform scan err = %08X\n", ret);
		}
		else
		{
			*count = size / sizeof(struct ScanData);
			return (struct ScanData *) scan_data;
		}
	}
	else
	{
		printf("Error, cannot initialise scan %08X\n", ret);
	}
 
	TermScan("wlan");
 
	return NULL;
}
 
/* Exit callback */
int exit_callback(int arg1, int arg2, void *common)
{
	sceWlanDevDetach();
	sceNetTerm();
	sceKernelExitGame();
	return 0;
}
 
/* Callback thread */
int CallbackThread(SceSize args, void *argp)
{
	int cbid;
 
	cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
	sceKernelRegisterExitCallback(cbid);
	sceKernelSleepThreadCB();
 
	return 0;
}
 
/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void)
{
	int thid = 0;
 
	thid = sceKernelCreateThread("update_thread", CallbackThread,
				     0x11, 0xFA0, PSP_THREAD_ATTR_USER, 0);
	if(thid >= 0)
	{
		sceKernelStartThread(thid, 0, 0);
	}
 
	return thid;
}
 
void start_ui(struct ScanData *pScan, int count)
{
	unsigned int last = 0;
	SceCtrlData pad;
	int ap = 0;
	int loop = 1;
	int vcount = 0;
	sceCtrlSetSamplingCycle(0);
	sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
	while(loop)
	{
		pspDebugScreenClear();
		printf("Scan found %d access point(s)\n\n", count);
 
		printf("Press X to rescan, SQUARE to quit\n");
 
		if (count == 0) printf("\nAuto re-scan in 30 seconds\n");
		else 			printf("Press O to view/cycle through the access points\n\n");
 
 
		if (ap == 0)
		{
			int x;
			for (x=0;x<count;x++)
			{
				print_apsum(&pScan[x]);
			}
		}
		else
		{
			printf("\nDisplaying access point %d:\n\n", ap);
			print_ap(&pScan[ap-1]);
			}
 
		while(loop)
		{
			unsigned int mask;
 
			sceCtrlReadBufferPositive(&pad, 1);
			mask = pad.Buttons & ~last;
			last = pad.Buttons;
			if(mask & PSP_CTRL_CIRCLE)
			{
				ap = (ap + 1) % (count+1);
				break;
			}
			if(mask & PSP_CTRL_CROSS) loop = 0;
			if(mask & PSP_CTRL_SQUARE) sceKernelExitGame();
/*-------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------
aquí pondria:    if(mask & PSP_CTRL_TRIANGLE)  goto MAIN;*/
			sceDisplayWaitVblankStart();
			if (count == 0)
			{
				if ((vcount % 60) == 0) printf(".");
				vcount++;
				if (vcount > (30*60)) loop = 0; // auto-rescan
			}
		}
	}
}
 
int net_thread(SceSize args, void *argp)
{
	int ret;
	struct ScanData *pScan = NULL;
	int count;
 
	printf("Please wait, performing WLAN AP scan...\n");
	ret = sceNetInit(0x20000, 0x20, 0x1000, 0x20, 0x1000);
	if(ret < 0)
	{
		printf("Error initialising network lib %08X\n", ret);
		goto error;
	}
 
	ret = -1;
	while(ret < 0)
	{
		ret = sceWlanDevAttach();
 
		/* If returns a error which indicates it isn't ready */
		if(ret == 0x80410D0E)
		{
			sceKernelDelayThread(1000000);
		}
		else if(ret < 0)
		{
			printf("Error attaching to wlan device %08X\n", ret);
			goto error;
		}
	}
 
	pScan = do_scan(&count);
	while (pScan != NULL)
	{
		start_ui(pScan, count);
 
		printf("\n\nPlease wait, performing WLAN AP scan...\n");
		pScan = do_scan(&count);
	}
 
error:
	sceWlanDevDetach();
	sceNetTerm();
 
	return 0;
}
 
/* Simple thread */
int main(int argc, char **argv)
{
	SceUID thid;
 
	SetupCallbacks();
 
	pspDebugScreenInit();
 
 
	if(pspSdkLoadInetModules() < 0)
	{
		printf("Error, could not load inet modules\n");
		sceKernelSleepThread();
	}
 
	/* Create a user thread to do the real work */
	thid = sceKernelCreateThread("net_thread", net_thread, 0x18, 0x10000, PSP_THREAD_ATTR_USER, NULL);
	if(thid < 0)
	{
		printf("Error, could not create thread\n");
		sceKernelSleepThread();
	}
 
	sceKernelStartThread(thid, 0, NULL);
 
	sceKernelExitDeleteThread(0);
 
//----------------------------------------------------------------------------------------------//------------------------------------------------------------------------------------------
//Y AKÍ ESTARIA EL MAIN
//      MAIN:
//     (MI CODIGO)
 
	return 0;
}

Lo que quiero hacer es que cuando pulse el boton triangulo, salga de todas las funciones y vuelva al main(), donde podré el codigo que quiero ejecutar.

Las modificaciones están encerradas en comentarios BIEN marcados

 

Espero que me podais ayudar.... :)


Proyectos[PSP]

-The playbook: Fase 1"traduccion...."                Traducion al español del libro de las jugadas de la serie Como conocí a vuestra madre

-Wifi craker: pausada (En pausa debido a aprendizaje a aplicaciones en kernel mode :D)

-Cronometro Rubik:100%!!  Lastima que no la admitiesen en concurso!


Anuncios Google