c++cwindowswinapi

WinApi Thread (Pointer error) with custom rand function


I have a problem; I want to make a program which gives a random number. I don't want use the rand() function. I want to make one for me then turn it to a function for educational purposes, 0but I have a problem.

see my code:

#include <stdio.h>
#include <iostream>
#include <conio.h>
#include <windows.h>

#define MIN 0
#define MAX 99999

using namespace std;

typedef struct _RANDOM_INFO{
    DWORD random;
    DWORD min;
    DWORD max;
} RANDOM_INFO, * LPRANDOM_INFO;

void Error(LPSTR lpErrorMessage){
    cout << lpErrorMessage << endl;
    exit(EXIT_FAILURE);
}

void GetRandom(LPVOID lpParam){
    
    DWORD dwListSize = 10000, min = 0, max = 99999;
    LPDWORD lpRandom = (LPDWORD)lpParam;
    LPSTR lpFileSelf, lpKernel, lpNtdll;    
    HMODULE hFileSelf = NULL, hKernel = NULL, hNtdll = NULL;
    
    hFileSelf = (HMODULE) GetModuleHandle(NULL);
    hKernel = (HMODULE) GetModuleHandle("kernel.dll");
    hNtdll = (HMODULE) GetModuleHandle("ntdll.dll");
    
    lpFileSelf = (LPSTR) hFileSelf;
    lpKernel = (LPSTR) hKernel;
    lpNtdll = (LPSTR) hNtdll;
    
    while(1){
        DWORD i;
        for(i = 0; i <= dwListSize; i++){
            *lpRandom = (DWORD)lpFileSelf[i];   
        }
        i = 0;
    }
    
    return;
}

int main(int argc, char **argv)
{
    DWORD random = 0;
    
    DWORD getRandomThreadId = 0;
    
    HANDLE hGetRandomThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetRandom, &random, 0, &getRandomThreadId);
    if(hGetRandomThread == INVALID_HANDLE_VALUE)
        Error("Cannot make a random list.");
        
    getch();
    
    cout << random << endl;
    Sleep(1500);
    
    return 0;
}

The variable should get a value when and print it but I always I get 0 and a windows error can someone tell me why? and another problem when I try to use the variable hKernel in the GetRandom function I get an error too, but it works fine with hFileSelf and hNtdll! is kernel protected from reading?

Note: this is not a random number generation, it's just a way to get a number from the memory when the user clicks on the enter on their keyboard, and it's not always the same time for all users so it's not always the same pointer in memory. I hope you understand what I want to do. Sorry for my bad English. just help me to fix the problem.

Thank you


Solution

  • Your GetRandom() function does not have the correct signature for a CreateThread() callback procedure. Try this instead:

    #include <stdio.h>
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    
    #define MIN 0
    #define MAX 99999
    
    using namespace std;
    
    typedef struct _RANDOM_INFO
    {
        DWORD random;
        DWORD min;
        DWORD max;
    } RANDOM_INFO, * LPRANDOM_INFO;
    
    void Error(LPSTR lpErrorMessage)
    {
        cout << lpErrorMessage << endl;
        exit(EXIT_FAILURE);
    }
    
    HMODULE hFileSelf = (HMODULE) GetModuleHandle(NULL);
    
    DWORD WINAPI GetRandomThreadProc(LPVOID lpParam)
    {
        LPDWORD lpRandom = (LPDWORD) lpParam;
    
        DWORD dwListSize = 10000, min = 0, max = 99999;
        LPBYTE lpFileSelf = (LPBYTE) hFileSelf;
    
        while (1)
        {
            for (DWORD i = 0; i <= dwListSize; ++i)
            {
                *lpRandom = (DWORD) lpFileSelf[i];   
            }
    
            Sleep(0);
        }
    
        return 0;
    }
    
    int main(int argc, char **argv)
    {
        DWORD dwRandom = 0;
        DWORD dwRandomThreadId = 0;
    
        HANDLE hGetRandomThread = CreateThread(NULL, 0, &GetRandomThreadProc, &dwRandom, 0, &dwRandomThreadId);
        if (hGetRandomThread == INVALID_HANDLE_VALUE)
            Error("Cannot make a random list.");
    
        do
        {
            getch();
            cout << dwRandom << endl;
        }
        while (WaitForSingleObject(hGetRandomThread, 0) == WAIT_TIMEOUT);
    
        CloseHandle(hGetRandomThread);
    
        return 0;
    }