Keresés

Új hozzászólás Aktív témák

  • pmonitor

    aktív tag

    válasz sztanozs #16528 üzenetére

    Készítettem én is egy 300000-es futtatást olyan szisztémával, mint ahogy Te csináltad. Tehát hogy az "A" program írta file-ba az adatokat. Ez lett az output. Nálam mondjuk mások az egyedi adatok:
    Egyedi PID: 241955
    Egyedi HWND: 286085
    a 300000-ből.
    Olyan eset nem volt, hogy mindkettő megegyezett volna. A program leírása itt található meg.

    @Silεncε:
    Ugye milyen jó, hogy nem fogadtál?
    Az itoa() szignatúrája: char * itoa ( int value, char * str, int base );

    Az én függvényem szignatúrája: char* int_ToStringC(int i, char* s, int base)
    Nincs többfajta input.

    @sztanozs:
    Pl. ilyen teszt programok esetén is elég so'xor kell integert konvertálni. Ahányszor meghívom a PidAndHwndA.exe-t, mindannyiszor 2 számot konvertál(a pid-et és a hwnd-t).
    Vagy másik példa a feledatkezelő. Ott is nagyon so'xor kell számot konvertálni. Mondjuk egyik esetben sem kell 30 misiszer konvertálni, de azért látszik, hogy akad 1-2 eset, amikor jó sokszor.

    @dabadab:
    Ugye, hogy nem veri meg ezt az assembly kódot!?

    @dabadab:
    Itt azt írtad, hogy:
    >A C az gyakorlatilag hordozható assembler, ennek megfelelően kell hozzáállni, aki ott azt mondaná, hogy a JMP használatát el kell kerülni, azt kiröhögnék.

    Szerintem a C nem hordozható assembler. Közel sem!!! Ilyent hogy írsz meg C-ben?

    push_chars :
    xor edx, edx
    mov ecx, base
    div ecx
    add edx, 0x30
    push edx
    inc ebx
    test eax, eax
    jnz push_chars
    pop_chars :
    pop eax
    stosb
    dec ebx
    cmp ebx, 0
    jg pop_chars

    Ezt én úgy írtam meg, hogy char tömböt használtam, és a végén "megfordítottam". De ez a megoldás nagyon nem ugyanaz, mint az asm esetén használt push-ok és pop-ok használata. A C közel sem hordozható assembler!

    @böng ész ő:
    >Ha elakadsz valamivel
    Egy programozó is el tud akadni valamivel? Én azt hittem, hogy azért tanultak olyan sokat, hogy a szakterületükön ne akadjanak el semmivel. De lehet, hogy tévedek/tévedtem. :F

  • pmonitor

    aktív tag

    válasz sztanozs #16528 üzenetére

    Készítettem tesztprogramot C-ben, csak nem tudom, hogy mikor tudom hosszasan futtatni. pidtesztA:
    #include <windows.h>

    HINSTANCE hInstance = NULL;
    char* AppName = "PID teszt \"A\"";
    char* WindowClassName = "pidtesztA";
    HWND AppHwnd = NULL;

    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

    int main()
    {
    WNDCLASSEX wc;
    MSG msg;
    hInstance = GetModuleHandle(NULL);
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WindowProc;
    wc.hbrBackground = COLOR_BTNFACE + 1;
    wc.hInstance = hInstance;
    wc.lpszMenuName = NULL;
    wc.lpszClassName = WindowClassName;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    RegisterClassEx(&wc);
    AppHwnd = CreateWindowEx(0, WindowClassName, AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 1200, 900, 0, 0, hInstance, 0);
    ShowWindow(AppHwnd, SW_SHOWDEFAULT);
    UpdateWindow(AppHwnd);
    while (GetMessage(&msg, 0, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
    }

    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch (uMsg)
    {
    case WM_CREATE:
    ShowWindow(AppHwnd, SW_NORMAL);
    break;
    case WM_COMMAND:
    break;
    case WM_SIZE:
    {
    break;
    }
    case WM_SHOWWINDOW:
    break;
    case WM_DESTROY:
    PostQuitMessage(0);
    break;
    default:
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
    break;
    }

    }

    pidtesztB:
    #include <stdio.h>
    #include <stdlib.h>
    #include <Windows.h>

    STARTUPINFOA SI;
    PROCESS_INFORMATION PI;
    HWND Pids[400000000];
    int PidsP = 0;
    int waitmsec = 500;

    int appStart(char name[])
    {
    if (!CreateProcessA(NULL, name, NULL, NULL, FALSE, 0, NULL, NULL, &SI, &PI))
    {
    printf("A %s file-t nem lehet megnyitni...\n", name);
    return -1;
    }
    WaitForSingleObject(PI.hProcess, waitmsec);
    return 0;
    }



    int main(int argc, char* argv[])
    {
    DWORD procid = 0, hwndid;
    ZeroMemory(&SI, sizeof(SI));
    SI.cb = sizeof(SI);
    ZeroMemory(&PI, sizeof(PI));
    if (argc == 3) waitmsec = atoi(argv[2]);
    char appA[50] = "pidtesztA.exe";
    char appAClass[50] = "pidtesztA";
    if (!appStart(appA))
    {
    HWND hwnd = FindWindowExA(NULL, NULL, appAClass, NULL);
    while (hwnd)
    {
    int pidact = 0;
    int tid = GetWindowThreadProcessId(hwnd, &pidact);
    Pids[PidsP] = pidact;
    PidsP++;
    hwnd = FindWindowExA(NULL, hwnd, appAClass, NULL);
    }
    TerminateProcess(PI.hProcess, 0);
    }
    HWND prochwnd;
    int i, out = 0, imax = 500;
    if (argc >= 2) imax = atoi(argv[1]);
    for (i = 0; i < imax; i++)
    {
    ZeroMemory(&SI, sizeof(SI));
    SI.cb = sizeof(SI);
    ZeroMemory(&PI, sizeof(PI));
    if (!appStart(appA))
    {
    HWND hwnd = FindWindowExA(NULL, NULL, appAClass, NULL);
    while (hwnd)
    {
    int pidact = 0;
    int tid = GetWindowThreadProcessId(hwnd, &pidact);
    int j = 0;
    while (j < PidsP)
    {
    if (Pids[j] == pidact)
    {
    printf("Pid egyezik!\n");
    out = 1;
    break;
    }
    j++;
    }
    if (out) break;
    Pids[PidsP] = pidact;
    PidsP++;
    hwnd = FindWindowExA(NULL, hwnd, appAClass, NULL);
    }
    TerminateProcess(PI.hProcess, 0);
    if (out) break;
    }
    }
    printf("i: %d\n", i);
    return 0;
    }

    Mint látható az "A" egy standard window. A "B" console. Az indítási intervallum, és a waitforsingleobject() ideje is alapból 500, de parancssorból változtatható, mint az a kódból is látható. A szám adatok validitását nem ellenőriztem le, csak egyből konvertál(legalábbis megpróbál :) ).
    Még nem tudtam hosszan futtatni. Ha vki. működésbeli hibát vesz észre, Ő kérem jelezze.

  • sztanozs

    veterán

    válasz sztanozs #16528 üzenetére

    Mivel a python parallel futtatja a formokat, így kisebb az esélye az ütközésnek, de így is sikerült HWND ütközést összehozni. Ha fizikailag is külön gépen futnak a processzek, akkor ennek nagyobb az esélye.

Új hozzászólás Aktív témák

Hirdetés