// drpfTest // Sample code for calling the DinkeyRemote module // The sample code contains 2 functions. The sample code is just a guide. // There are two methods to loading a DRPF file. These are shown in the first two functions: // DoUpdateCode and DoUpdateCodewithMod // DoUpdateCode: we load the DRPF file from disk and get a handle and use it "as is" using the API // call LoadDRPFFromFile. You can make some limited changes to overwrite the default // behaviour by using API flags. // DoUpdateCodewithMod: we load the DRPF file from disk and load into structures. We can then modify the // DRPF settings by modifying this structure. This method uses the API calls // ReadDRPFEx and LoadDRPF. #include #include #include "Visual Studio 5\DinkeyRemote\resource.h" #include "drpf.h" #ifdef _MSC_VER #pragma warning(disable:4996) // to disable warnings about sprintf etc... means we can use the same source for all compilers #endif char g_szAppName[] = "drpfTest"; void DisplayLastMessage(void); // gets & displays the message from the DinkeyRemote Module // load a DRPF file from disk and generate an update code as specified by the DRPF file int DoUpdateCode(char *szFileDRPF) { DRPF_HANDLE drpfHandle; UPDATE_CODE_OUTPUTS Outputs; int err_code; // load DRPF from File into memory drpfHandle = LoadDRPFFromFile(szFileDRPF, &err_code); if (drpfHandle == NULL) { DisplayLastMessage(); return err_code; } // generate the update code as specified by the DRPF file err_code = GenerateUpdateCode(drpfHandle, 0, 0, NULL, NULL, &Outputs); // Unload DRPF from memory UnloadDRPF(&drpfHandle); // display message (error or success) DisplayLastMessage(); return err_code; } // load a DRPF file from disk, modify it in memory and then generate the update code int DoUpdateCodeWithMod(char *szFileDRPF) { DRPF_HANDLE drpfHandle; int dummy1, dummy2, err_code; REMOTEINFO RemoteInfo; LICENCEINFO LicenceInfo[MAX_LICENCES]; ALGCHANGE AlgChanges[MAX_ALG_CHANGES]; DATACHANGE DataChanges[MAX_DATA_CHANGES]; UPDATE_CODE_OUTPUTS Outputs; // in this case we need to read the DRPF into our structures, so that the DRPF values can be modified err_code = ReadDRPFEx(szFileDRPF, &RemoteInfo, (LICENCEINFO *)&LicenceInfo, (ALGCHANGE *)&AlgChanges, (DATACHANGE *)&DataChanges, &dummy1, &dummy2); if (err_code != 0) { DisplayLastMessage(); return err_code; } // patch new values in the RemoteInfo, LicenceInfo, AlgChanges, DataChanges structures LicenceInfo[0].FeaturesFlag = 1; // so that the features value below will be recognised LicenceInfo[0].Features = 12345; LicenceInfo[0].AddSetExecs = 1; // so the executions will be added to existing LicenceInfo[0].Execs = 100; // get DRPF handle drpfHandle = LoadDRPF(&RemoteInfo, LicenceInfo, AlgChanges, DataChanges, &err_code); if (drpfHandle == NULL) { DisplayLastMessage(); return err_code; } // generate the update code as specified by the DRPF file err_code = GenerateUpdateCode(drpfHandle, 0, 0, NULL, NULL, &Outputs); // Unload DRPF from memory UnloadDRPF(&drpfHandle); // display message (error or success) DisplayLastMessage(); return err_code; } // routine for main dialog box BOOL CALLBACK MainDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { char szFileDRPF[256]; switch (message) { case WM_INITDIALOG: break; case WM_COMMAND: GetDlgItemText(hwnd, IDC_DRPF_PATH, szFileDRPF, sizeof(szFileDRPF)); // *** Generate Update Code button clicked *** if (LOWORD(wParam) == IDC_UPDATE_CODE && HIWORD(wParam) == BN_CLICKED) { DoUpdateCode(szFileDRPF); } // *** Generate Update Code with Modification button clicked *** if (LOWORD(wParam) == IDC_UPDATE_CODE_MOD && HIWORD(wParam) == BN_CLICKED) { DoUpdateCodeWithMod(szFileDRPF); } break; case WM_CLOSE: EndDialog(hwnd, TRUE); return TRUE; } return FALSE; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow ) { // display dialog allow user to enter code DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)MainDlgProc); // display main screen return 0; } // gets & displays the message from the last API call to the DinkeyRemote Module void DisplayLastMessage(void) { char *szMessage; int msg_len; GetLastMessage(NULL, 0, &msg_len); szMessage = (char *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, msg_len); if (szMessage != NULL) { GetLastMessage(szMessage, msg_len, NULL); MessageBox(NULL, szMessage, g_szAppName, MB_OK); HeapFree(GetProcessHeap(), 0, szMessage); } return; }