Frost Moon Project

urldec.cpp - urldec Ver.1.00 - Frost Moon Project   アクセスランキング  

Home > ソフトウェア > urldec > urldec100.zip > urldec.cpp

 

広告
/*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
    urldec Ver.1.00
    Coded by x@rgs

    This code is released under NYSL Version 0.9982
    See NYSL_withfaq.TXT for further details.

    cl urldec.cpp kernel32.lib user32.lib /O1 /GS- /link /subsystem:windows /nodefaultlib /merge:".rdata=.text"
#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*/
#define UNICODE
#define _UNICODE
#include<stdio.h>
#include<windows.h>
#include<tchar.h>

void urlDecode(TCHAR* dst,const TCHAR *src){
    TCHAR *p1=NULL,*p2=NULL;
    char utf8_str[5]={};
    int skip=0,pos=0;
    TCHAR* str=(TCHAR*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(lstrlen(src)+1)*sizeof(TCHAR));

    lstrcpy(str,src);
    for(int i=0;i<lstrlen(str);i++)if(str[i]=='+')str[i]=' ';
    p1=str;

    while(1){
        for(p2=p1;*p2&&*p2!='%';p2++);
        if(!*p2){
            lstrcat(dst,p1);
            break;
        }

        lstrcpyn(dst+lstrlen(dst),p1,p2-p1+1);
        p1=(++p2)+2;

        int hex=0;

        for(int i=0;i<2;i++){
            const TCHAR c=*(p2+i);
            if(c>='0'&&c<='9')hex=16*hex+(c-'0');
            else if(c>='a'&&c<='f')hex=16*hex+((c-'a')+10);
            else if(c>='A'&&c<='F')hex=16*hex+((c-'A')+10);
        }

        if(pos==0){
            if(hex<0x80)skip=0;
            else if(hex<0xc2)skip=0;
            else if(hex<0xe0)skip=1;
            else if(hex<0xf0)skip=2;
            else if(hex<0xf5)skip=3;
            else skip=0;
        }

        utf8_str[pos]=hex;

        if(pos<skip){
            pos++;
            continue;
        }

        utf8_str[pos+1]='\0';
        int buffer_size=MultiByteToWideChar(CP_UTF8,0,utf8_str,-1,NULL,0);
        if(buffer_size){
            wchar_t* w_str=(wchar_t*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,buffer_size*sizeof(wchar_t));

            MultiByteToWideChar(CP_UTF8,0,utf8_str,-1,w_str,buffer_size);
            lstrcat(dst,w_str);
            HeapFree(GetProcessHeap(),0,w_str);
        }
        pos=0;
    }
    HeapFree(GetProcessHeap(),0,str);
    return;
}

int getClipboardSize(){
    if(!IsClipboardFormatAvailable(CF_TEXT))return -1;
    if(!OpenClipboard(NULL))return -1;

    HGLOBAL hglobal=GetClipboardData(CF_UNICODETEXT);

    CloseClipboard();
    return GlobalSize(hglobal);
}

bool setClipboardText(const TCHAR* text,int length){
    bool result=false;

    if(!OpenClipboard(NULL))return result;

    HGLOBAL hglobal=GlobalAlloc(GMEM_MOVEABLE,(length+1)*sizeof(TCHAR));
    if(hglobal!=NULL){
        lstrcpy((TCHAR*)GlobalLock(hglobal),text);
        GlobalUnlock(hglobal);
        EmptyClipboard();
        result=SetClipboardData(CF_UNICODETEXT,hglobal)!=NULL;
    }
    CloseClipboard();
    return result;
}

bool getClipboardText(TCHAR* result){
    if(!IsClipboardFormatAvailable(CF_TEXT))return false;
    if(!OpenClipboard(NULL))return false;

    HGLOBAL hglobal=GetClipboardData(CF_UNICODETEXT);

    lstrcpy(result,(TCHAR*)GlobalLock(hglobal));

    GlobalUnlock(hglobal);
    CloseClipboard();

    return true;
}

extern "C" void WinMainCRTStartup(){
    TCHAR* src=(TCHAR*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,getClipboardSize());
    TCHAR* dst=(TCHAR*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,getClipboardSize());

    if(!src||!dst||!getClipboardText(src))ExitProcess(1);
    urlDecode(dst,src);
    setClipboardText(dst,lstrlen(dst));
    HeapFree(GetProcessHeap(),0,dst);
    HeapFree(GetProcessHeap(),0,src);
    ExitProcess(0);
}


Home > ソフトウェア > urldec > urldec100.zip > urldec.cpp