Generowanie klucza PID dla systemu Windows 7

dział ogólny

Generowanie klucza PID dla systemu Windows 7

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 00:52

Witam :)

Chciałbym napisać aplikację, która generować będzie PID klucza systemu przy pomocy biblioteki pidgenx.dll (jest w każdym systemie windows powyżej XP[choć w xp chyba również]).
W Internecie jest wiele przykładów kodów, ale żaden nie jest w C++ :( mniej więcej wiem jak mają wyglądać parametry i wiem, że funkcja nosi nazwę "PidGenX".

Tak więc podam może kilka przykładów, jakie znalazłem w różnych językach, może uda nam się coś z tego wyczytać:

RealBasic (to jest cały, działający program):
Kod: Zaznacz cały
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //This project/code is provided by Daz from mydigitallife.info, it's open source and may be used by anyone.
  ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  StatusPage.DeleteAllRows
  If System
.IsFunctionAvailable("PidGenX","pidgenx.dll") Then
    StatPoint
.Text = "Status: Processing, please wait..."
    Me.Sleep(1000)
    #pragma DisableBackgroundTasks True
    Soft Declare Function PidGenX Lib "pidgenx.dll" (WindowsKey As WString, PkeyPath As WString, MPCID As WString, UnknownUsage As Integer, GeneratedProductID As Ptr, OldDigitalProductID As Ptr, DigitalProductID As Ptr) As Integer
    
//////////////////////////////////////////////////////////////
    Dim GenPID As New MemoryBlock(100)
    GenPID.Byte(0) = 50
    
//
    Dim OldPID As New MemoryBlock(164)
    OldPID.Byte(0) = 164
    
//
    Dim CoreData As New MemoryBlock(1272)
    CoreData.Byte(0) = 248
    CoreData
.Byte(1) = 4
    
//////////////////////////////////////////////////////////////
    Dim RetID As Integer = PidGenX(Serial, ConfigPath, "XXXXX", 0, GenPID, OldPID, CoreData) //The MPC ID can be anything, this is just an example so I have kept it basic.
    //////////////////////////////////////////////////////////////
    If RetID = 0 Then
      
//////////
      Dim PID As String = CleanupString(GenPID.WString(0)) //PID
      Dim EPID As String = CleanupString(CoreData.WString(8)) //Extended PID
      Dim AID As String = CleanupString(CoreData.WString(136)) //Activation ID
      Dim WEDID As String = CleanupString(CoreData.WString(280)) //Edition
      Dim SubType As String = CleanupString(CoreData.WString(888)) //Subtype
      Dim LType As String = CleanupString(CoreData.WString(1016)) //License type
      Dim CID As String = CleanupString(CoreData.WString(1144)) //License channel
      //////////
      StatusPage.AddRow("Key status: Valid")
      If PID <> "" Then StatusPage.AddRow("PID: "+PID)
      If EPID <> "" Then StatusPage.AddRow("Extended PID: "+EPID)
      If AID <> "" Then StatusPage.AddRow("Activation ID: "+AID)
      If WEDID <> "" Then StatusPage.AddRow("Edition: "+WEDID)
      If SubType <> "" Then StatusPage.AddRow("Subtype: "+SubType)
      If LType <> "" Then StatusPage.AddRow("License type: "+LType)
      If CID <> "" Then StatusPage.AddRow("License channel: "+CID)
      If EPID <> "" Then StatusPage.AddRow("Crypto ID: "+Mid(EPID,9,3))
    ElseIf RetID = -2147024894 Then
      StatusPage
.AddRow("Error: pkeyconfig.xrm-ms is missing")
    ElseIf RetID = -2147024809 Then
      StatusPage
.AddRow("Error: Invalid arguments")
      //ElseIf RetID = -1979645695 Then
      //StatusPage.AddRow("Key status: Invalid")
    Else
      StatusPage
.AddRow("Key status: Invalid") //Just incase we will say invalid for all other errors
    End If
    
#pragma DisableBackgroundTasks False
    StatPoint.Text = "Status: Waiting..."
  Else
    StatusPage
.AddRow("Unsupported OS")
  End If 


C++ (ale w .net :(, tylko kawałek kodu ):
Kod: Zaznacz cały
[DllImport("kernel32", SetLastError = true)]
public static extern IntPtr LoadLibrary(string fileName);

[
DllImport("kernel32", SetLastError = true)]
public static extern bool FreeLibrary(IntPtr hModule);

[
DllImport("pidgenx.dll", EntryPoint = "PidGenX", CharSet = CharSet.Auto)]
static extern int PidGenX(string ProductKey, string PkeyPath, string MSPID, int UnknownUsage, IntPtr ProductID, IntPtr DigitalProductID, IntPtr DigitalProductID4);

private string CheckProductKey(string ProductKey)
{
    string dllPath = temp + "\\pidgenx.dll";        //temp is the folder path that has the dll and config file
    IntPtr dllHandle = LoadLibrary(dllPath);
    .
    .
    .
    string PKeyPath = temp + "\\pkeyconfig.xrm-ms";
    .
    .
    .
    Marshal.FreeHGlobal(PID);
    Marshal.FreeHGlobal(DPID);
    Marshal.FreeHGlobal(DPID4);
    bool clear  = true;
    while(clear)                                 //Must be run thrice in order to dereference the pointer
        clear = FreeLibrary(dllHandle); 
    return result
;
}
 


Tutaj jest VB.net (ale podobno nie do konca działający):
Kod: Zaznacz cały
 
Imports System
.Runtime.InteropServices

Public Class Form1

    Declare Auto Function PidGenX Lib 
"C:\pidgen_v_32.dll" _
    
(ByVal one As String, _
    ByVal two As String
, _
    ByVal three As String
, _
    ByVal four As IntPtr
, _
    ByVal five As IntPtr
, _
    ByVal six As IntPtr
, _
    ByVal seven As IntPtr
) As Integer

    Private Sub Button1_Click
(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles Button1
.Click

        Dim keystring As String 
= "BH626-XT3FK-MJKJH-6GQT2-QXQMF"
        Dim pkeypath As String = "C:\pkeyconfig.xrm-ms"
        Dim num As String = "55041"
        Dim unk1 As IntPtr = 0

        Dim genPID As IntPtr 
= Marshal.AllocHGlobal(100)
        Marshal.WriteByte(genPID, 0, &H32)
        Marshal.WriteByte(genPID, 1, &H0)
        Marshal.WriteByte(genPID, 2, &H0)
        Marshal.WriteByte(genPID, 3, &H0)
        Dim cleargenPID As Integer = 0
        For cleargenPID 
= 4 To 99
            Marshal
.WriteByte(genPID, cleargenPID, &H0)
        Next cleargenPID

        Dim oldPID As IntPtr 
= Marshal.AllocHGlobal(164)
        Marshal.WriteByte(oldPID, 0, &HA4)
        Marshal.WriteByte(oldPID, 1, &H0)
        Marshal.WriteByte(oldPID, 2, &H0)
        Marshal.WriteByte(oldPID, 3, &H0)
        Dim clearoldPID As Integer = 0
        For clearoldPID 
= 4 To 163
            Marshal
.WriteByte(oldPID, clearoldPID, &H0)
        Next clearoldPID

        Dim DPID4 As IntPtr 
= Marshal.AllocHGlobal(1272)
        Marshal.WriteByte(DPID4, 0, &HF8)
        Marshal.WriteByte(DPID4, 1, &H4)
        Marshal.WriteByte(DPID4, 2, &H0)
        Marshal.WriteByte(DPID4, 3, &H0)
        Dim clearDPID4 As Integer = 0
        For clearDPID4 
= 4 To 1271
            Marshal
.WriteByte(DPID4, clearDPID4, &H0)
        Next clearDPID4

        Dim query As Integer 
= PidGenX(keystring, pkeypath, num, unk1, genPID, oldPID, DPID4)

        Dim message As String = "Return code: " + query.ToString + vbNewLine
        message 
+= vbNewLine
        If 
(query = 0) Then message += "Valid key: " + keystring
        If 
(query = -2147024894) Then message += "pkeyconfig.xrm-ms is missing"
        If (query = -2147024809) Then message += "generic arguments incorrect"
        If (query = -1979645695) Then message += "Invalid key: " + keystring
        message 
+= vbNewLine
        message 
+= vbNewLine

        Dim readgpid As Integer 
= 0
        Dim curbyte As Integer 
= 0
        Dim tpid As String 
= ""
        For readgpid = 0 To 99
            curbyte 
= Marshal.ReadByte(genPID, readgpid)
            If ((curbyte > 31) And (curbyte <127> 31) And (currbyte <127> 31) And (currentbyte < 127)) Then
                transferdpid 
+= Chr(currentbyte)
            Else
                transferdpid 
+= "."
            End If
        Next readdpid
        Dim vistapid As String 
= transferdpid

        message 
+= "Arg 5, Generated PID:" + vbNewLine + ">>" + gpid + "<<" + vbNewLine
        message 
+= vbNewLine
        message 
+= "Arg 6, Old PID:" + vbNewLine + ">>" + xppid + "<<" + vbNewLine
        message 
+= vbNewLine
        message 
+= "Arg 7, DPID4:" + vbNewLine + ">>" + vistapid + "<<" + vbNewLine
        message 
+= vbNewLine

        TextBox1
.Clear()
        TextBox1.AppendText(message)

        Marshal.FreeHGlobal(oldPID)
        Marshal.FreeHGlobal(DPID4)
        Marshal.FreeHGlobal(genPID)

    End Sub

End Class 


A tutaj jest mój kod, któryz oczywiście nie działa, no bo jak:
Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
#include <windows.h>
#include <stdio.h>
#include <string.h>
using namespace std;


// DLL function signature:
typedef int (*importFunction)(UnicodeString WindowsKey, UnicodeString PkeyPath, UnicodeString MSPID, int *UnknownUsage, int *ProductID, int *DigitalProductID, int *DigitalProductID4);

int main(int argc, char **argv)
{
    UnicodeString Key = "Tutaj wpisuje 29znakowy klucz (wraz z myslnikami), ale na razie nic tu nie bedzie, bo byloby to nieco nielegalne";
    importFunction GeneratePID;

    int result;
//       Te "struct'y" powinny chyba być po wykonaniu funkcji, a tutaj powinno znajdowac sie cos typu BYTE (ale nie wiem)
    struct DigitalProductId {
    unsigned int uiSize;
    BYTE bUnknown1[4];
    char szProductId[28];
    char szEditionId[16];
    BYTE bUnknown2[112];
    };

    struct DigitalProductId4 {
    unsigned int uiSize;
    BYTE bUnknown1[4];
    WCHAR szAdvancedPid[64];
    WCHAR szActivationId[72];
    WCHAR szEditionType[256];
    BYTE bUnknown2[96];
    WCHAR szEditionId[64];
    WCHAR szKeyType[64];
    WCHAR szEULA[64];
    };

    // Load DLL file
    HINSTANCE hinstLib = LoadLibrary(TEXT("pidgenx.dll"));
    if (hinstLib == NULL) {
        printf("ERROR: unable to load DLL\n");
        return 1;
    }

    // Get function pointer
    GeneratePID = (importFunction)GetProcAddress(hinstLib, "PidGenX");
    if (GeneratePID == NULL) {
        printf("ERROR: unable to find DLL function\n");
        FreeLibrary(hinstLib);
        return 1;
    }

    // Call function.
    result = GeneratePID(Key, "pkeyconfig.xrm-ms", "XXXX", 0, NULL, DigitalProductId, DigitalProductId4);

    // Unload DLL file
    FreeLibrary(hinstLib);

    // Display result

    return 0;
    system("pause");
}
//---------------------------------------------------------------------------  




Wytłumaczę jeszcze jedno - DigitalProductID to ciąg bajtów, który składa się z 164 bajtów, gdzie pierwszy to 164 (czyli rozmiar ciągu), a pozostałe elementy analogicznie:
DigitalProductID4 jest długi na 1272 bajty, zaczynać się musi dwoma bajtami: 248 i 4 ProductID ma długość 100 i zaczyna się bajtem o wartości dziesiętnej 50.

Domyślam się, że mam to zrobić przez Serializację, jednak nie wiem jak taki zabieg przeprowadzić no i nie wiem jaki jest odpowiednik IntPtr w C++ - dopiero zaczynam zabawę w programowanie :)

No więc, wiem że to jest to skomplikowane i mam nadzieję, że razem jakoś damy temu radę.

Dziękuję z góry za jakiekolwiek wskazówki i proszę o nie pisanie postów w stylu "poczytaj, google.com, zobacz w podręczniku, itd"

EDIT:
A i zapomniałem dodac, że funkcja PidGenX zwraca wartości w formie argumentów, czyli: 4 ostatnie argumenty, chociaż właściwie 3, bo "UnknownUsage" jest mi niepotrzebny, mają być przekazywane do funkcji, zmieniane przez nią, co ma powodować, że zmienne w moim programie przyjmą określoną wartość (czyli chyba coś ze wskaźnikami.
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez Cyfrowy Baron » wtorek, 13 lipca 2010, 08:47

PID klucza systemu Windows to klucz instalacyjny - tak?

Czyżby chodziło Tobie o to: patrz: Cyfrowy Baron

Jeżeli to coś innego, to wytłumacz co to jest ten PID, gdyż ta nazwa kojarzy mi się z Process IDentifier, czyli jest to unikalny identyfikator procesu w wielozadaniowych systemach operacyjnych, ale dotyczy to procesów uruchamianych w systemie, a nie samego systemu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 08:50

Twoją (choć pewnie nie do końca) funkcję już widziałem, ale tutaj jest to proces odwrotny - biblioteka pidgenx.dll tworzy ID produltu na podstawie wpisanego klucza oraz informuje czy jest on prawidłowy, do jakiej edycji i w jakiej wersji (Retail, OEM, itd). Przydatna rzecz jesli mamy wiele kluczy i chcemy sprawdzić które są poprawne :)

W załączniku daję poprawioną (nie przeze mnie) funkcję na pozyskanie klucza z rejestru - teraz działa na x64.

Kod: Zaznacz cały

char
GetWindowsKey(BOOL is64 false)
{
    if (
is64) {
        
#define WIN64KEY
    
}
   
charwsResult;            //Return a Window Product Key
   
HKEY  hRegistryKey;          //Registry Handler
   
BYTE *DigitalProductID 0;  //Digital Product Key Value
   
DWORD DataLength;            //Digital Product Key Length
   
BYTE  ProductKeyExtract[15]; //Extract Key
   
char  sCDKey[30];            //Temp, adding a Window Product Key
   
int   ByteCounter;           //Counter
   
int   k;                     //Convert
   
int   nCur;                  //XOR calculate
   
bool  bOk false;

   const 
char *KeyChars[] = {
      
"B","C","D","F","G","H","J","K","M",
      
"P","Q","R","T","V","W","X","Y",
      
"2","3","4","6","7","8","9",NULL
   
};

   const 
char NT_CURRENT[] = "SOFTWARE\\MICROSOFT\\Windows NT\\CurrentVersion";
   
#ifdef WIN64KEY
      #ifdef KEY_WOW64_64KEY
      #else
         #define KEY_WOW64_64KEY 0x0100
      #endif
   
if( RegOpenKeyEx(HKEY_LOCAL_MACHINENT_CURRENT,
      
REG_OPTION_NON_VOLATILEKEY_QUERY_VALUE KEY_WOW64_64KEY,
      &
hRegistryKey) == ERROR_SUCCESS )
   
#else
   
if( RegOpenKeyEx(HKEY_LOCAL_MACHINENT_CURRENT,
      
REG_OPTION_NON_VOLATILEKEY_ALL_ACCESS,
      &
hRegistryKey) == ERROR_SUCCESS )
   
#endif
   
{
      
DataLength 1272;
      
//Allocate Memory
      
DigitalProductID = new byte[DataLength];

      
//Memory Initialization
      
memset(DigitalProductID0DataLength);

      
//Digital Product
      
if( RegQueryValueEx(hRegistryKey"DigitalProductId",
         
NULLNULLDigitalProductID, &DataLength) == ERROR_SUCCESS )
      {
         
//reading a value start position 52, by 66
         
memcpy(ProductKeyExtractDigitalProductID+5215);
         
bOk true;
      }

      
//Release Memory
      
if(DigitalProductIDdelete []DigitalProductID;

      
//Close Registry
      
RegCloseKey(hRegistryKey);
   }

   if( !
bOk )
      return 
wsResult;

   
//Start Converting job, Next Step
   
memset(sCDKey0sizeof(sCDKey));

   for(
ByteCounter=24ByteCounter >= 0; --ByteCounter)
   {
      
nCur 0;

      for(
k=14>= 0; --k)
      {
         
nCur = (nCur 256) ^ ProductKeyExtract[k];

         
ProductKeyExtract[k] = nCur 24;
         
nCur %= 24;
      }

      
strcat(sCDKeyKeyChars[nCur]);

      
//Insert "-"
      
if( !(ByteCounter 5) && ByteCounter )
         
strcat(sCDKey"-");
   }

   
strrev(sCDKey);
   
wsResult sCDKey;
   
char *pch;
   
pch strstr(wsResult"-");
   if (
pch != NULL) {
      return 
wsResult;
   } else {
       
GetWindowsKey(true);
   }
#ifdef WIN64KEY
#undef WIN64KEY
#endif
}
 
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez Cyfrowy Baron » wtorek, 13 lipca 2010, 08:53

Skąd wziąłeś bibliotekę pidgenx.dll?
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 08:55

Jest obecna w systemie - jak mówiłem, sprawdze czy klucz jest poprawny, więc bierze udział w aktywacji orazgeneracji PID.

Edit: zobacz załącznik :)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Ostatnio edytowano wtorek, 13 lipca 2010, 08:57 przez janek2012, łącznie edytowano 2 razy
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez Cyfrowy Baron » wtorek, 13 lipca 2010, 08:56

W Windows XP w wersji 32bit jest tylko biblioteka pidgen.dll.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 09:14

Powyżej w załączniku :)
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez Cyfrowy Baron » wtorek, 13 lipca 2010, 09:18

Nic mi po bibliotece pidgenx.dll działającej tylko w Vista i Win7.

Tutaj masz kod w ludzkim (VC++) języku: http://bbs.betabbs.com/index.php?showtopic=2313 a wszystko dzięki uprzejmości google.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 09:27

Niezły kod, ale niestety w Win7 trzeba to zrobić inaczej. No nic, popróbuje jeszcze :)
EDIT:

A gdybym tak w realBasic skompilował DLL, któremu dawałbym tylko Klucz, a on, odwołując się do pidgenx, wypisywałby wszystko w ciągu bajtów, a potem mógłbym podzielić ten ciąg przez "struct"?
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez Cyfrowy Baron » wtorek, 13 lipca 2010, 10:33

Niezły kod, ale niestety w Win7 trzeba to zrobić inaczej. No nic, popróbuje jeszcze


To prawdopodobnie kwestia zabezpieczeń. Musisz uzyskać od systemu "pozwolenie" na dostęp do tej biblioteki.

A gdybym tak w realBasic skompilował DLL, któremu dawałbym tylko Kluc


Skoro znasz język RealBasic i umiesz w tym programować, to napisz cała aplikację w tym języku.



Dla Windows 7: http://forums.mydigitallife.info/archive/index.php/t-10858.html
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Przekazanie argumentów do biblioteki DLL

Nowy postprzez polymorphism » wtorek, 13 lipca 2010, 10:48

mniej więcej wiem jak mają wyglądać parametry

Tylko mniej więcej... W sygnaturze dałeś UnicodeString'a, a przecież to jest typowo VCL-owa klasa, po stronie biblioteki zupełnie nieznana. Jak większość rzeczy w WinAPI, funkcja jest pisana pod C, więc stringi przekazujesz przez wskaźniki char* lub wchar_t*.

Moja propozycja wskaźnika na tę funkcję jest taka:
Kod: Zaznacz cały
typedef HRESULT (WINAPI *importFunction)(LPCWSTR,LPCWSTR,LPCWSTR,LPVOID,LPVOID,LPVOID,LPVOID); 

Założyłem, że funkcja przyjmuje stringi unikodowe, ale jakby coś nie śmigało, można spróbować z LPCSTR, czyli ANSI-stringami.
Ostatnio edytowano wtorek, 13 lipca 2010, 14:18 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Generowanie klucza PID dla systemu Windows 7

Nowy postprzez janek2012 » wtorek, 13 lipca 2010, 11:41

Dziekuję wszystkim za odpowiedzi :) Na MyDigitalLife już patrzyłem, tam zbytnio mi nie pomogli :P RealBasic niestety nie znam ani trochę.

@polymorphism,
dzięki za wskaźnik :)

A jak mam zadeklarować zmienne, które podam jako 4 ostatnie argumenty? Chodzi mi o ich typ, BYTE?
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Re: Generowanie klucza PID dla systemu Windows 7

Nowy postprzez polymorphism » wtorek, 13 lipca 2010, 13:03

To zależy od tego, co to są za dane. Oczywiście BYTE[] może być, jeśli chcesz zdefiniować jakiś tam bufor na dane, które interpretować będziesz później za pomocą rzutowań. Ale z tego co widzę, trzy ostanie parametry to wskaźniki na zmienne typu strukturalnego, więc tutaj dylemat dotyczący typów raczej opada.

---- dodane ----

Poprawiłem wskaźnik na funkcję, bo wkradł się drobny błąd, no i typ zwracany jest teraz taki, jak powinien. Sprawdzałem u siebie na XP, funkcja działa, w tym sensie, że nie powoduje błędów. Niestety nie mam odpowiedniego klucza, żeby sprawdzić, co zwraca w strukturach, ponieważ po paru sekundach funkcja zwraca wartość 0x8A010101 (z tego co znalazłem w sieci, oznacza ona, że klucz jest nieprawidłowy).
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Generowanie klucza PID dla systemu Windows 7

Nowy postprzez polymorphism » środa, 14 lipca 2010, 17:56

Jeśli będzie działał, wyślij mi proszę kod źródłowy twojego programu, zobaczę jak to zrobiłeś.

Działa. Tu masz definicje struktur i wskaźnika na funkcję:
Kod: Zaznacz cały
struct genPid_t
{
    DWORD    cbSize;
    WCHAR    productId[48];
};

struct digPid_t
{
    DWORD    cbSize;
    DWORD    dwUnknown1;
    CHAR    productID[28];
    CHAR    editionID[16];
    BYTE    bUnknown2[112];
};

struct digPid4_t
{
    DWORD    cbSize;
    DWORD    unknown;
    WCHAR    extendedPID[64];    
    WCHAR    activationID
[72];    
    WCHAR    editionID
[304];        
    WCHAR    subType
[64];        
    WCHAR    licenseType
[49];    
    WCHAR    licenseChannel
[79];    
};

typedef HRESULT (WINAPI *PidGenX_t)(LPCWSTR,LPCWSTR,LPCWSTR,LPVOID,genPid_t*,digPid_t*,digPid4_t*);  

Funkcja zwróci:
  • S_OK - jeśli klucz jest poprawny
  • 0x8A010101 - jeśli klucz jest niepoprawny
  • inne wartości, które są między innymi zdefiniowane w winerror.h

Przed wywołaniem funkcji, pola cbSize powinny mieć przypisaną wielkość struktury, do której należą.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Generowanie klucza PID dla systemu Windows 7

Nowy postprzez janek2012 » środa, 14 lipca 2010, 23:07

Niestety, u mnie definicja funkcji nie działa :(
[BCC32 Error] File3.cpp(16): E2303 Type name expected


Ktoś wie jak to naprawić?

EDIT: Czyżby chodziło o mieszanie WinAPI i VCL?
Avatar użytkownika
janek2012
Bladawiec
Bladawiec
 
Posty: 30
Dołączył(a): poniedziałek, 12 lipca 2010, 22:56
Podziękował : 1
Otrzymał podziękowań: 0
System operacyjny: Windows 8 x64
Kompilator: C++ Builder XEe
SKYPE: janek2012
Gadu Gadu: 1489603
    Windows 7Opera

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 29 gości

cron