Screenshots sin sXe-Injected
#1
Buenas, abro un debate para la comunidad donde sería maneras de lograr crear un sistema de screens como el sxe-injected.

A mi me dio la siguiente idea pero no sé si es posible de hacer. Yo la tiro, ustedes debatan si hay mejores posibilidades, si se puede o no se puede, étc.

Mis 2 ideas son la siguiente:

Primera idea: Esta no se si se puede enviar archivos del cliente vía sockets..

1- Crear un comando vía server que ejecute el comando "snapshot" del cliente.
2- Una vez que se guarda la screen del snapshot del cliente, subirla mediante sockets a una web.
3- Una vez subida a la web. Large el mensaje con el link para ver su screen.


Segunda idea: DLL Cliente donde envie archivos vía sockets de la imagen.

1- Crear una dll (cliente) donde mediante un comando EJ: (_MandarScreen) automaticamente saque snapshot y la suba el mismo cliente.
2- Vía AMXX hacemos una validación de comando. EJ: Sí existe _MandarScreen esta todo OK.
3- Vía AMXX creamos un comando (amx_fotito) que al cliente automaticamente le escriba (_MandarScreen).

Bueno, mi segunda idea era algo como esto. Programado en C++. (La verdad es que probe el código pero la imagen no la enviaba bien, igualmente antes de seguir con el proyecto mi idea era consultar si esto puede llegar a ser posible, porque is no seria trabajo al pedo la verdad. Pero bueno, es un debate así que gg).

Código PHP:
int fread_blocks(FILE *filechar *dataint blocksxint mode)
{
    
FILE *fp = (FILE *)file;
    
    if (!
fp)
        return 
0;
    
    
size_t blocks blocksx;
    switch (
mode)
    {
        case 
1//char
        
{
            
char *= new char[blocks];
            
char *ptr a;
            
size_t res fread(asizeof(char), blocksfp);
            while (
blocks--)
                *
data++ = (*ptr++);
            
delete [] a;
            return 
res;
        }
        case 
2//short
        
{
            
short *= new short[blocks];
            
short *ptr a;
            
size_t res fread(asizeof(short), blocksfp);
            while (
blocks--)
                *
data++ = (*ptr++);
            
delete [] a;
            return 
res;
        }
        case 
4//int
        
default:
        {
            
int *= new int[blocks];
            
int *ptr a;
            
size_t res fread(asizeof(int), blocksfp);
            while (
blocks--)
                *
data++ = (*ptr++);
                
delete [] a;
            return 
res;
        }
    }
    
    return 
0;
}

int add(char dest2[], int lenchar src2[], int nada)
{
    
char *src src2;
    
char *dest dest2;
    
char *start dest;
    
int c lennada;
    
    while (*
dest && c--)
        ++
dest;
    
    if (
d)
    {
        while (
c-- && d-- && *src)
            *
dest++ =* src++;
        *
dest 0;
        
        return (
dest start);
    }
    
    while (
c-- && *src)
        *
dest++ =* src++;
    *
dest 0;
    
    return (
dest-start);
}


charsocket_getip(char *hostname2)
{
    
char *hostname;
    
hostname hostname2;
    
    
struct hostent *host_info;
    
host_info gethostbyname(hostname);
    if(
host_info == NULL)
        return 
0;
    
    
struct in_addr addr;
    
addr.s_addr = *(u_long *)host_info->h_addr;
    
    return 
inet_ntoa(addr);
}

#define formatex _snprintf
void sendImage()
{
    
char UPLOAD_HOST[]        = "localhost";
    
char UPLOAD_SCRIPT[]    = "/asd.php";
    
    
SOCKET sockstruct sockaddr_in _sockaddr;
    
WSADATA wsastruct hostent *host;
    
    
WSAStartup(MAKEWORD(2,0), &wsa);
    
    
char *ip2 socket_getip(UPLOAD_HOST);
    
g_Engine.Con_Printf("%s | %s\n"UPLOAD_HOSTip2);
    
    
    
_sockaddr.sin_addr.s_addr inet_addr(ip2);
    
_sockaddr.sin_family AF_INET;
    
_sockaddr.sin_port htons(80);
    
    
sock socket(AF_INETSOCK_STREAMIPPROTO_TCP);
    
    if(!
sock) {
        
g_Engine.Con_Printf("sock no \n");
        return;
    }
    
    
int connecx connect(sock, (struct sockaddr*)&_sockaddrsizeof(sockaddr));
    
    if(
connecx != 0) {
        
g_Engine.Con_Printf("connecx no\n");
        return;
    }
    
    
char g_upInfo[256], sFileName[51], g_upFilename[256];
    
    
formatex(sFileName50"fotito.jpg");
    
formatex(g_upFilename255"C:\\fotito.jpg");
    
formatex(g_upInfo255"namefile=%s"sFileName);
    
    
    
FILE *sFile fopen(g_upFilename"rb");
    
    if(!
sFile || !file_exists(g_upFilename)) {
        
g_Engine.Con_Printf("[BK SOCKETS] -> Error en la foto\n");
        return;
    }
    
    
char START_FORMDATA[]    = "--642865735weasdasdwe4285675865\r\nContent-Disposition: form-data; name=\"file\"; filename=\"temp\"\r\n\r\n";
    
char END_FORMDATA[]    = "\r\n--642865735weasdasdwe4285675865--\r\n";
    
    
    
int sendbytes 0;
    
    
char buff[512];
    
int data_sizepacket_size;
    
fseek(sFile0SEEK_END);
    
data_size ftell(sFile);
    
fseek(sFile0SEEK_SET);
    
data_size += (sizeof(START_FORMDATA) + sizeof(END_FORMDATA));
    
    
packet_size  formatex(buffsizeof(buff),
    
"POST %s?%s HTTP/1.1\nHost: %s\nContent-Type: multipart/form-data; boundary=642865735weasdasdwe4285675865\r\nContent-Length: %d\r\n\r\n",
    
UPLOAD_SCRIPTg_upInfoUPLOAD_HOSTdata_size);
    
    
add(buffsizeof(buff), START_FORMDATA0);
    
packet_size += sizeof(START_FORMDATA);
    
    
send(sockbuff,packet_size,0);
    
    
g_Engine.Con_Printf("enviado\n");
    
    
char buff2[2048];
    
int read_sizesend_size;
    
    
fseek(sFilesendbytesSEEK_SET);
    do{
        
read_size fread_blocks(sFilebuff2sizeof(buff2), 1);
        
        
send_size send(sockbuff2read_size0);
        if(
send_size == 0) {
            
g_Engine.Con_Printf("send_size[0]\n]");
            return;
        }
        
        if(
send_size == -1) {
            
g_Engine.Con_Printf("send size -1\n");
            return;
        }
        
        
sendbytes += send_size;
    }while(
read_size == sizeof(buff2));
    
    
    
send_size send(sockEND_FORMDATAsizeof(END_FORMDATA), 0);
    if(
send_size == 0) {
        
g_Engine.Con_Printf("send_size[0] 2\n]");
        return;
    }
    
    if(
send_size == -1) {
        
g_Engine.Con_Printf("send size -1 2\n");
        return;
    }
    
    
g_Engine.Con_Printf(buff);
    
    
fclose(sFile);

}

void createCommands(void) { g_Engine.pfnAddCommand("_MandarScreen"sendImage); } 

En caso que todo esto sea posible. Para detectar que por ej si el cliente esta usando esta dll. Podriamos usar g_Engine.PlayerInfoSetValueForKey (creo que era así) agregandole un. "*screen 1" ej. (Ya que el cliente por default no puede escribir el (*) en la setinfo). Y vía amxx podriamos hacer algo como...

Código PHP:
#include <amxmodx>

public plugin_init() register_plugin("Screens""v1.0""heNk'");
public 
client_putinserver(idfunc_Screens(id);

public 
func_Screens(id)
{
    new 
sInfo[20];
    
get_user_info(id"*screen"sInfocharsmax(sInfo));
    
    if(
sInfo[0]) {
        
client_print_color(idprint_chat"A vos si se te pueden sacar screens :3");
    }
    else {
        
server_cmd("kick #%d ^"No puedes entrar al servidorRazonNo se te pueden sacar screens^""get_user_userid(id));
    }


Quedaria por crear un comando...

Código PHP:
#include <amxmodx>
#include <amxmisc>

public plugin_init() {
    
register_plugin("Command Screen""v1.0""heNK'");
    
    
register_concmd("amx_screenshot""concmd_ScreenShot"ADMIN_KICK"<Nombre>");
}

public 
concmd_ScreenShot(idlevel ,cid) {
    if(!
cmd_access(idlevelcid,  1))
        return 
PLUGIN_HANDLED;
        
    new 
sArg[33];
    
read_argv(1sArgcharsmax(sArg));
    
    new 
iPlayer cmd_target(idsArgCMDTARGET_ALLOW_SELF);
    
    if(!
iPlayer) return PLUGIN_HANDLED;
    
    
client_cmd(iPlayer"_MandarScreen");
    
    
client_print(idprint_chat"Y papa le sacaste screen al wacho %n"iPlayer);
        
    return 
PLUGIN_HANDLED;


Y para terminar. El "asd.php" sería:

Código PHP:
<?php    
    $FileName 
$_GET['namefile'];
    
    
$uploadfile "asdxd/".$FileName//Lo enviamos en una carpeta llamada "asdxd"
    
    
if(move_uploaded_file($_FILES['file']['tmp_name'], $uploadfile)){
        echo 
'enviadito ja';
        
    }else{
        echo 
'Nonono';
    }
    
    echo 
'<br>'.$uploadfile;
?>
Responder
#2
Interesante, espero actualizaciones de este posteo.
Responder
#3
estaria bueno la primera teoria para evitar al publico descargar cosas y hacerlo en todos los jugadores, hasta los viejos q retornan al game y no saben q anticheat usar.

Ojala entendiera algo de C++ :c
Responder
#4
Lo dije 20 veces y de nuevo, no hay forma de que el cliente suba fotos al servidor porque el engine del juego no está programado para eso.

Si en lo que respecta usar una .dll es tu idea, entonces no necesitas ningún código web ni nada, hacés lo mismo que hace el sXe y listo, lo cual es:

1) Sacas foto a la pantalla.
2) Lees todos los datos Hex del archivo y los hasheas (vas separando todo en partes de X cantidad de chars, cadena de string por cadena de string, una por una) y través de un comando, enviás al servidor:
[SS-Send] string1_32chars
[SS-Send] string2_32chars
[SS-Send] string3_32chars, etc
[SS-Send] EndOfFile -> le decis al servidor que ya está enviada
3) El servidor al recibir string por string, deshashea y va armando el archivo, y al recibir EndOfFile (lastpart en el sXe), listo, ya tenés el archivo subido, sin uso de sockets ni nada.

(De más está decir que podrías usar Arrays y sacar 32 fotos a todos al mismo tiempo y recibir todo, pero payas hizo que solo se pueda sacar una a la vez, ahí tenés su nivel como programador).

El problema es el siguiente:
NADIE se va a bajar NINGÚN programa externo para jugar, y si lo hacés requerido, andá olvidándote de los players porque se van a jugar a otro servidor que no rompa tanto las pelotas pidiendo cosas ...
Es más, es una lástima que no se puedan precachear .dlls, sino ya te imaginarás en que hubiésemos convertido el juego con extensiones gráficas y potenciacion de limitaciones actuales del engine, hasta el cliente del UAC pude haber echo ...
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#5
(03/08/2020, 03:46 AM)Cr3470r escribió: Lo dije 20 veces y de nuevo, no hay forma de que el cliente suba fotos al servidor porque el engine del juego no está programado para eso.

Si en lo que respecta usar una .dll es tu idea, entonces no necesitas ningún código web ni nada, hacés lo mismo que hace el sXe y listo, lo cual es:

1) Sacas foto a la pantalla.
2) Lees todos los datos Hex del archivo y los hasheas (vas separando todo en partes de X cantidad de chars, cadena de string por cadena de string, una por una) y través de un comando, enviás al servidor:
[SS-Send] string1_32chars
[SS-Send] string2_32chars
[SS-Send] string3_32chars, etc
[SS-Send] EndOfFile -> le decis al servidor que ya está enviada
3) El servidor al recibir string por string, deshashea y va armando el archivo, y al recibir EndOfFile (lastpart en el sXe), listo, ya tenés el archivo subido, sin uso de sockets ni nada.

(De más está decir que podrías usar Arrays y sacar 32 fotos a todos al mismo tiempo y recibir todo, pero payas hizo que solo se pueda sacar una a la vez, ahí tenés su nivel como programador).

El problema es el siguiente:
NADIE se va a bajar NINGÚN programa externo para jugar, y si lo hacés requerido, andá olvidándote de los players porque se van a jugar a otro servidor que no rompa tanto las pelotas pidiendo cosas ...
Es más, es una lástima que no se puedan precachear .dlls, sino ya te imaginarás en que hubiésemos convertido el juego con extensiones gráficas y potenciacion de limitaciones actuales del engine, hasta el cliente del UAC pude haber echo ...

No se mucho de programacion pero si hay algo en lo que no concuerdo con lo que decis.. creo que hay mucha gente que estaria dispuesta a tomarse unos pocos minutos para bajar un programa externo si eso les garantiza la posibilidad de jugar tranquilos. Quizas vos seas un groso programando pero en lo que respecta al usuario comun del juego, al tipo que quiere entrar a jugar tranquilo sin que unos enfermitos se hagan los pro usando cheats, de eso si no sabes mucho.. puedo asegurarte que en esa afirmacion estas equivocado. de hecho te agregue a discord y te escribi consultandote como ibas con tu anticheat pero hasta el dia de hoy no he recibido respuesta... ojala alguien que entienda y la tenga clara se tomara el tiempo de poder hacer algo para reeemplazar al ya obsoleto Injected.
Responder
#6
(03/08/2020, 03:53 PM)Luzbe28 escribió: No se mucho de programacion pero si hay algo en lo que no concuerdo con lo que decis.. creo que hay mucha gente que estaria dispuesta a tomarse unos pocos minutos para bajar un programa externo si eso les garantiza la posibilidad de jugar tranquilos. Quizas vos seas un groso programando pero en lo que respecta al usuario comun del juego, al tipo que quiere entrar a jugar tranquilo sin que unos enfermitos se hagan los pro usando cheats, de eso si no sabes mucho.. puedo asegurarte que en esa afirmacion estas equivocado. de hecho te agregue a discord y te escribi consultandote como ibas con tu anticheat pero hasta el dia de hoy no he recibido respuesta... ojala alguien que entienda y la tenga clara se tomara el tiempo de poder hacer algo para reeemplazar al ya obsoleto Injected.

No respondo más consultas sobre el UAC por el momento hasta no llegar a un acuerdo con algunas personas, por otro lado sólo estás tirando palabras al aire, intenté hacer un cliente UAC el cual se requirió en un 32 slots que tenía 24/7 el server con 31 players y 1 slot reservado (para admins), cuestión que al requerir el cliente y dar kick con link de descarga, de 31 players solo 5 quedaron, los demás se fueron a otros servidores, conclusión: no reinventar la rueda, ya fué echo y ya se comprobó que no funcionó.

La única por la que la mayoría se inclinan hasta día de hoy es el sXe-Injected, el problema con la versión actual (17.2) es que no es compatible con Steam, sólo eso, no me acuerdo con quién hablé para parchar a la 17.2 y largar un 17.2 (Fix) para que sea compatible con Steam y así vuelven a usarlo, pero no sé si payas se va a calentar o algo ...
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#7
(04/08/2020, 03:02 AM)Cr3470r escribió: No respondo más consultas sobre el UAC por el momento hasta no llegar a un acuerdo con algunas personas, por otro lado sólo estás tirando palabras al aire, intenté hacer un cliente UAC el cual se requirió en un 32 slots que tenía 24/7 el server con 31 players y 1 slot reservado (para admins), cuestión que al requerir el cliente y dar kick con link de descarga, de 31 players solo 5 quedaron, los demás se fueron a otros servidores, conclusión: no reinventar la rueda, ya fué echo y ya se comprobó que no funcionó.

La única por la que la mayoría se inclinan hasta día de hoy es el sXe-Injected, el problema con la versión actual (17.2) es que no es compatible con Steam, sólo eso, no me acuerdo con quién hablé para parchar a la 17.2 y largar un 17.2 (Fix) para que sea compatible con Steam y así vuelven a usarlo, pero no sé si payas se va a calentar o algo ...

Bueno, te comento.. no soy re importamte... pero tengo por lo menos un minimo de 15 sv donde yo estaria re interesado en implementarlo y la gente que entra con tal de jugar tranquilos estaria mas que dispuesta tambien. Hoy debido a lo obsoleto del injected es necesario algo nuevo. Por otro lado, lo mio no son palabras al aire, no es lo mismo querer implementar algo nuevo cuando el injected tiene copado el mercado por asi decirlo y recibiendo actualizaciones. hoy el injected no recibe actualizacion.. ya hace bastante. Tampoco podes esperar largar el anticheat y que al otro dia tengas 2 millones de descargas..creo que es un proceso y que este es el mejor momento para lanzar algo asi.. Por eso tambien digo, ojala hubiera algun iluminado que tenga tiempo, ganas y los conocimientos para lanzar algo.  te puedo asegurar que seria mucho mas facil implementarlo hoy por hoy.
Con respecto al sXe-Injected.. para que un fix de algo que no tiene actualizacion? o sea, por lo menos para mi no vale la pena, haces un fix solo para que lo usen los steam... yo cambie 2 archivos y uso el steam con injected.. no entiendo para que me serviria un fix. yo usuario necesito otra cosa mas que un fix, necesito un anticheat que funcione y reciba actualizacion.. porque si pongo en la balanza y sacan un fix para el sXe para usarlo con steam pero no recibe actualizacion y por otro lado me ofreces un anticheat que funciona, que lo actualizan.. no hay mucho que pensarlo, PARA MI, aclaro. igual respeto que no respondas consultas ni nada por el estilo. aunque soy sincero y espero que no llegues a ese acuerdo o si.. lo que mejor sea para la comunidad, bienvenido sea.
Responder
#8
Te voy a apuntar a esto nada más y ahí cerraríamos:

(04/08/2020, 02:18 PM)Luzbe28 escribió: Por eso tambien digo, ojala hubiera algun iluminado que tenga tiempo, ganas y los conocimientos para lanzar algo.  te puedo asegurar que seria mucho mas facil implementarlo hoy por hoy.
yo usuario necesito otra cosa mas que un fix, necesito un anticheat que funcione y reciba actualizacion..

Para un trabajo TAN COMPLEJO no creo que encuentren a alguien TAN IMBÉCIL como para hacer todo ese laburo GRATIS.
Y si llegase a aparecer ese IMBÉCIL que lo haga GRATIS (lo cual lo dudo enormemente), allá el y su manera de perder el tiempo.
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#9
Es que por más que se fixee el sXe, ya salieron al aire 60.000 cheats y 30.000 spoofers. Así que no vale ni la pena intentar eso, porque baneas a alguien y a los 5 minutos vuelve a entrar. Salieron cheats con steamid changer, así que ya ni lo intentes.
Responder
#10
(04/08/2020, 03:44 PM)Niper.-. escribió: Es que por más que se fixee el sXe, ya salieron al aire 60.000 cheats y 30.000 spoofers. Así que no vale ni la pena intentar eso, porque baneas a alguien y a los 5 minutos vuelve a entrar. Salieron cheats con steamid changer,

Otra vez con el tema del baneo ... el tema es suprimir lo que ya hay para hacerlo más jugable, no hacer un ban definitivo ... me temo que este tema es para debatirlo durante mucho tiempo como ya se hizo ...

(04/08/2020, 03:44 PM)Niper.-. escribió: así que ya ni lo intentes.

Me venís a dar ordenes?, ahora lo hago y te voy a bloquear el chit, por vivo.
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#11
(04/08/2020, 03:40 PM)Cr3470r escribió: Te voy a apuntar a esto nada más y ahí cerraríamos:


Para un trabajo TAN COMPLEJO no creo que encuentren a alguien TAN IMBÉCIL como para hacer todo ese laburo GRATIS.
Y si llegase a aparecer ese IMBÉCIL que lo haga GRATIS (lo cual lo dudo enormemente), allá el y su manera de perder el tiempo.

Acaso yo dije o hablé de algo gratis? Calculo que la persona que tenga los conocimientos para hacer algo así, también tiene la cabeza para pensar como monetizarlo. No es muy difícil.. saludos
Responder
#12
(05/08/2020, 01:13 PM)Luzbe28 escribió: Acaso yo dije o hablé de algo gratis? Calculo que la persona que tenga los conocimientos para hacer algo así, también tiene la cabeza para pensar como monetizarlo. No es muy difícil.. saludos

No creo que alguien pague U$D10 o U$D20 de donación por cada actualización de un Anti-Cheat, de ser el caso, con 5 personas que paguen lo veo muy bajo, pero allá el que pierda tiempo haciendolo ...
(15/12/2020, 07:06 PM)Mario AR. escribió: Cuando tu acatante conozca de tu nuevo puerto, te volverá a atacar
Responder
#13
Buenas, acá dejo el último update que hice que fue un par de días luego de haber hecho el post, pero bueno por razones personales no voy a continuar con el proyecto experimental. Lo último que habia hecho para testear era el uso bitmaps (cosa que mediante el cs si no me equivoco se puede usar el mismo opengl para tomar la captura). Ahora, dejo el código que si funciona para enviar imagenes vía sockets.

El proyecto anda perfecto, por si quieren usarlo de experimentación las capturas se sacan y se suben.

Código PHP:
void sendImage(char *imagen_subirchar *solo_imagen)
{
    
char UPLOAD_HOST[]       = "experimental.bkgaming.net";
    
char UPLOAD_SCRIPT[]     = "/asd.php";

    
SOCKET sockstruct sockaddr_in _sockaddr;
    
WSADATA wsastruct hostent *host;

    
WSAStartup(MAKEWORD(2,0), &wsa);

    
char *ip2 socket_getip(UPLOAD_HOST);

    
_sockaddr.sin_addr.s_addr inet_addr(ip2);
    
_sockaddr.sin_family AF_INET;
    
_sockaddr.sin_port htons(80);

    
sock socket(AF_INETSOCK_STREAMIPPROTO_TCP);

    if(!
sock) {
        
printf("sock no \n");
        return;
    }

    
int connecx connect(sock, (struct sockaddr*)&_sockaddrsizeof(sockaddr));

    if(
connecx != 0) {
        
printf("connecx no\n");
        return;
    }

    
char g_upInfo[64], sFileName[64], g_upFilename[256];

    
formatex(sFileName63solo_imagen);
    
formatex(g_upFilename255imagen_subir);
    
formatex(g_upInfo63"namefile=%s"sFileName);


    
FILE *sFile fopen(g_upFilename"rb");
    
    if(!
sFile || !file_exists(g_upFilename)) {
        
printf("[BK SOCKETS] -> Error en la foto\n");
        return;
    }

    
    

    
char START_FORMDATA[]    = "--642865735weasdasdwe4285675865\r\nContent-Disposition: form-data; name=\"file\"; filename=\"temp\"\r\n\r\n";
    
char END_FORMDATA[]     = "\r\n--642865735weasdasdwe4285675865--\r\n";


    
int sendbytes 0;
    
sendbytes 0;
    

    
char buff[512];
    
int data_sizepacket_size;
    
fseek(sFile0SEEK_END);
    
data_size ftell(sFile);
    
fseek(sFile0SEEK_SET);
    
data_size += (sizeof(START_FORMDATA)-sizeof(END_FORMDATA)-1);

    
packet_size  formatex(buffsizeof(buff)-1,
        
"POST %s?%s HTTP/1.1\nHost: %s\nContent-Type: multipart/form-data; boundary=642865735weasdasdwe4285675865\r\nContent-Length: %d\r\n\r\n",
    
UPLOAD_SCRIPTg_upInfoUPLOAD_HOSTdata_size);

    
add(buffsizeof(buff)-1START_FORMDATA0);
    
packet_size += sizeof(START_FORMDATA)-1;

    
//socket_send(sock, buff, packet_size);
    
send(sockbuff,packet_size,0);

    
printf("enviado\n");

    
char buff2[2048];
    
int read_sizesend_size;
    
    
fseek(sFilesendbytesSEEK_SET);
    do{
        
read_size fread_blocks(sFilebuff2sizeof(buff2), 1);
        
        
send_size send(sockbuff2read_size0);
        
//send_size = socket_send(sock, buff2, read_size);
        
if(send_size == 0) {
            
printf("send_size[0]\n]");
            return;
        }

        if(
send_size == -1) {
            
printf("send size -1\n");
            return;
        }

        
sendbytes += send_size;
    }while(
read_size == sizeof(buff2));

    
//send_size = socket_send(sock, END_FORMDATA);
    
send_size send(sockEND_FORMDATAsizeof(END_FORMDATA), 0);
    if(
send_size == 0) {
        
printf("send_size[0] 2\n]");
        return;
    }

    if(
send_size == -1) {
        
printf("send size -1 2\n");
        return;
    }


    
fclose(sFile);
}



void bkMandarScreen(void)
{
       
GdiplusStartupInput gdiplusStartupInput;
       
ULONG_PTR gdiplusToken;
    
GdiplusStartup(&gdiplusToken, &gdiplusStartupInputNULL);
    

        {

            
HDC scrdcmemdc;
            
HBITMAP membit;
            
scrdc = ::GetDC(0);
            
int Height GetSystemMetrics(SM_CYSCREEN);
            
int Width GetSystemMetrics(SM_CXSCREEN);
            
memdc CreateCompatibleDC(scrdc);
            
membit CreateCompatibleBitmap(scrdcWidthHeight);
            
HBITMAP hOldBitmap =(HBITMAPSelectObject(memdcmembit);
            
BitBlt(memdc00WidthHeightscrdc00SRCCOPY);
            
Gdiplus::Bitmap bitmap(membitNULL);
            
CLSID clsid;
            
GetEncoderClsid(L"image/jpeg", &clsid);

            

            
char *sName g_Engine.pfnGetCvarString("name");
            
            
char sFile[256], szDireccion[256];
            
formatex(szDireccion255"\\BK_Screenshots");
            
strcpy(sFilesDireccion);
            
strcat(sFileszDireccion);

            if(!
DirExists(sFile)) {
                
mkdir(sFile);
            }

            
int randomNumber get_systime();

            
wchar_t *uName charToWChar(sName);
            
wchar_t *uDireccion charToWChar(sFile);

            
WCHAR uFileName[256];
            
char sFileName[256], solo_imagen[256];
            
sprintf(solo_imagen"%s%i.jpg"sNamerandomNumber);
            
wsprintf(uFileNameL"%s\\%s%i.jpg",uDireccionuNamerandomNumber);
            
sprintf(sFileName"%s\\%s%i.jpg",sFilesNamerandomNumber);

            
bitmap.Save(uFileName, &clsid);
            
            
sendImage(sFileNamesolo_imagen);
            

            
SelectObject(memdchOldBitmap);
            
DeleteObject(memdc);
            
DeleteObject(membit);
            
ReleaseDC(0scrdc);
    
        
    }
    
GdiplusShutdown(gdiplusToken);
}


int GetEncoderClsid(const WCHARformatCLSIDpClsid)
{
    
using namespace Gdiplus;
    
UINT  num 0;          // number of image encoders
    
UINT  size 0;         // size of the image encoder array in bytes
    
ImageCodecInfopImageCodecInfo NULL;
    
GetImageEncodersSize(&num, &size);
    if(
size == 0)
        return -
1;  // Failure
    
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(
pImageCodecInfo == NULL)
        return -
1;  // Failure
    
GetImageEncoders(numsizepImageCodecInfo);
    for(
UINT j 0num; ++j)
    {
        if( 
wcscmp(pImageCodecInfo[j].MimeTypeformat) == )
        {
            *
pClsid pImageCodecInfo[j].Clsid;
            
free(pImageCodecInfo);
            return 
j;  // Success
        
}    
    }
    
free(pImageCodecInfo);
    return 
0;

Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)