Self-built OJ Kernel

Source: Internet
Author: User

In other words, the test results in windows are very unstable... There are still many bugs that won't be changed. Please prepare for the final exam.

Silly and naive...

Code:

#include <windows.h>#include <ntsecapi.h>#include<iostream>#include<cstdio>#include<cstring>#include<string>#define SystemProcessesAndThreadsInformation 5using namespace std;typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION) (DWORD,PVOID,DWORD,PDWORD);typedef struct _SYSTEM_PROCESS_INFORMATION{    DWORD NextEntryDelta;    DWORD ThreadCount;    DWORD Reserved1[6];    FILETIME ftCreateTime;    FILETIME ftUserTime;    FILETIME ftKernelTime;    UNICODE_STRING ProcessName;    DWORD BasePriority;    DWORD ProcessId;    DWORD InheritedFromProcessId;    DWORD HandleCount;    DWORD Reserved2[2];    DWORD VmCounters;    DWORD dCommitCharge;    ULONG   dwPageFaults;    DWORD   dwWorkingSetPeak;    DWORD   dwWorkingSet;    DWORD   dwQuotaPeakPagedPoolUsage;    DWORD   dwQuotaPagedPoolUsage;    DWORD   dwQuotaPeakNonPagedPoolUsage;    DWORD   dwQuotaNonPagedPoolUsage;    DWORD   dwPageFileUsage;    DWORD   dwPageFileUsagePeak;    PVOID ThreadInfos[1];} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;HMODULE hNtDll =GetModuleHandle("ntdll.dll");ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll,"ZwQuerySystemInformation");ULONG cbBuffer=0x10000;LPVOID pBuffer=malloc(cbBuffer);string workpath,gpppath,gccpath,fpcpath,javapath,command,debuger;inline DWORD get(DWORD &pid){    ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pBuffer,cbBuffer,NULL);    PSYSTEM_PROCESS_INFORMATION pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;    while(1)    {        if(pInfo->ProcessId==pid)return pInfo->dwWorkingSet;        if(pInfo->NextEntryDelta==0)break;        pInfo=(PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)+pInfo->NextEntryDelta);    }    pid=0;    return 0;}inline void cls(){    for(int i=0;i<100;++i)printf("\b");}int Compling(int LanuageId){    printf("Compling...");    switch(LanuageId)    {        case 0:command=gpppath+"g++ foo.cpp -o foo -fno-asm -s -w -O1 -DONLINE_JUDGE  2>error.txt";break;        case 1:command=gccpath+"gcc foo.c -o foo -fno-asm -s -w -O1 -DONLINE_JUDGE  2>error.txt";break;        case 2:command=fpcpath+"fpc foo.pas -Sg -dONLINE_JUDGE>error.txt"; break;        case 3:command=javapath+"javac foo.java 2> error.txt"; break;        default :printf("Sorry,system nonsupport this lanuage.\n");    }    if(system(command.c_str())==0)return 1;    return 0;}int Debug(int LanuageId){    cls();    printf("Testing...");    /***************************************************/    fclose(stdin);    fclose(stdout);    STARTUPINFO si={0};    PROCESS_INFORMATION pi={0};    si.cb=sizeof(si);    freopen("test.txt","r",stdin);    si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);    freopen("out.txt","w",stdout);    si.hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);    si.hStdError=GetStdHandle(STD_ERROR_HANDLE);    si.dwFlags=STARTF_USESTDHANDLES;    /***************************************************/    if(LanuageId<3)command="foo";    else command=javapath+"java foo";    TCHAR *szCommandLine=new TCHAR[command.size()+1];    szCommandLine[command.size()]=0;    copy(command.begin(),command.end(),szCommandLine);    DWORD StartTime=GetTickCount();    DWORD EndTime;    DWORD TimeLen=2000;    DWORD MemorySize=5000000;    DWORD Maxsize=0;    int ERROR_ID=0;    if(CreateProcess(NULL,szCommandLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi))    {        while(pi.dwProcessId)        {            Maxsize=max(Maxsize,get(pi.dwProcessId));            if(Maxsize>MemorySize)            {                ERROR_ID=2;                break;            }            if(StartTime+TimeLen<GetTickCount())            {                ERROR_ID=1;                break;            }        }        if(ERROR_ID)CloseHandle(pi.hThread),CloseHandle(pi.hProcess);        EndTime=GetTickCount();    }    else ERROR_ID=3;    fclose(stdin);    fclose(stdout);    freopen("CON", "w", stdout);    cls();    if(ERROR_ID==1)cout<<"Time Limit Exceed"<<endl;    if(ERROR_ID==2)cout<<"Memory Limit Exceed"<<endl;    if(ERROR_ID==3)cout<<"Runtime Error "<<GetLastError()<<endl;    if(!ERROR_ID)    {        command="fc ans.txt out.txt >Debug.txt";        if(system(command.c_str())==0)        {            cout<<"Accept "<<EndTime-StartTime<<" ms  "<<(Maxsize/1024)<<" K"<<endl;        }        else printf("Wrong Answer\n");    }    return 0;}void setworkpath(){    workpath="D:\\project\\";    gpppath=workpath+"compiler\\MinGW\\bin\\";    gccpath=workpath+"compiler\\MinGW\\bin\\";    fpcpath=workpath+"compiler\\fpc\\";    javapath=workpath+"compiler\\java\\bin\\";}int main(){    setworkpath();    if(Compling(0))Debug(0);    else printf("Complie Error\n");    free(pBuffer);    command="del foo.exe foo.class error.txt out.txt Debug.txt";    system(command.c_str());    return 0;}

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.