2025-06-04 03:22:50 +02:00

119 lines
4.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// The dtlibwrapper is an annoying workaround to make Sony's dtlib dll play
// nicely with our exes (such as vxconsole).
//
// dtlib is Sony's library for bidirectional communication with the PS3 console.
// (ie, it is the PC side of the DECI3 interface.)
// dtlib.dllis linked against Microsofts dynamic C Runtime library.
// VXConsole and all our libs are of course statically linked to the CRT so that
// we can subvert malloc(). Ordinarily this wouldnt really be a problem, except
// that some functions in dtlib.dll pass and return STL strings by value:
// HCONNECT dt_connect( std::string hostname, int portNo, std::string programName )
// std::string dt_geterrormsg( int errorno )
// This causes a crash because it guarantees that memory will be allocated on one
// side of the DLL boundary and deallocated on the other (because of the pass-by-
// value semantics).
//
// Therefore we construct this tiny DLL which links against the DLL version of
// msft's runtime, and whose only purpose is to reexport functions which expect
// a std::string parameter into ones that use char *s. By ensuring that
// std::strings are only constructed or destructed on this side of the DLL boundary,
// we avoid trouble with the free store.
#ifndef DTLIBWRAPPER_H
#define DTLIBWRAPPER_H
#pragma once
#ifdef DTLIBWRAPPER_DLL_EXPORT
#define DTLIBWRAP_API __declspec(dllexport)
#else
#define DTLIBWRAP_API __declspec(dllimport)
#endif
#include "dtlib.h"
// #include <string>
// #include <vector>
// This is the API for the dtlib; you get a pointer
// to this class instance and then call its functions.
// Call the static GetSingleton() to get the instance
// of this.
class DTLIBWRAP_API Idtwrap
{
public:
/*
// local typedefs to shadow (but be equal to) the global ones
// copied from dtlib.h
typedef HANDLE HCONNECT;
typedef HANDLE HDECI;
typedef HANDLE HSELECT;
typedef HANDLE HDRIVER;
typedef HANDLE HPROTO;
typedef BOOL (CALLBACK DECIRECVPROC)(HDECI, BYTE*, int size, int status);
typedef BOOL (CALLBACK DCMPRECVPROC)(HCONNECT, BYTE*, int size);
typedef BOOL (CALLBACK DRIVERRECVPROC)(HDRIVER, BYTE*, int size);
typedef enum DT_DESTINATION {
HOST = 0, // Host Application
MGR = 1, // Communication Processor
TARGET = 2, // Protocol Driver
};
*/
virtual UINT32 dt_set_option(UINT32 value) = 0 ;
virtual HCONNECT dt_connect(const char * hostname, int portNo,
const char * programName) = 0;
virtual void dt_disconnect(HCONNECT connect) = 0 ;
virtual HDECI dt_register(HCONNECT connectH, int protocol, int port,
deci3_lib::DT_DESTINATION dst, const char * lparName,
int priority=128) = 0;
virtual int dt_unregister(HDECI deciHandle) = 0 ;
virtual int dt_send(HDECI deciHandle, BYTE* data, int length) = 0 ;
virtual int dt_receive(HANDLE deciHandle, BYTE* data, int length) = 0 ;
// error & error messages
virtual int dt_getlasterror() = 0 ;
// signature differs from dtlib:
// you pass in a pointer to a (preallocated) buffer in which to store the error.
// returns the length of the original string ( if it's greater than buflen, you
// didn't get the whole string )
virtual int dt_geterrormsg( char *pOutBuf, unsigned int bufLen, int error) = 0 ;
virtual int dt_get_protocol(HANDLE handle, int &protocol, int &port) = 0 ; // deprecated
// signatures on these change from dtlib:
// instead of returning a std::vector, these
// function accept a pointer to a (preallocated
// by you) array of the underlying structs,
// and the max length of that array.
// It will copy the structs into the array and return
// the number of structs it wanted to copy. If that
// number is greater than the size of the buffer you fed
// in, you didn't get the whole result.
virtual int dt_get_registered_list( DtRegisteredInfo* pOutArray, unsigned int outLen, HCONNECT connectH) = 0 ;
virtual int dt_get_protocol_list( DtProtocolInfo *pOutArray, unsigned int outLen, HCONNECT connectH, const char * lparName) = 0 ;
enum { kLPAR_NAME_LENGTH = 64 };
// as above, but note that you are passing in an array of
// arrays: the inner dimension must be the constant kLPAR_NAME_LENGTH
virtual int dt_get_lparlist( char pOutBufs[][kLPAR_NAME_LENGTH], unsigned int numBufs, HCONNECT connectH) = 0 ;
virtual int dt_get_version( char *pOutBuf, unsigned int bufLen, HCONNECT connectH) = 0 ;
virtual int dt_power_status(HCONNECT connH, int &status) = 0 ;
virtual HANDLE dt_select(HCONNECT connH, int waitTime) = 0 ;
virtual int dt_set_dcmp_status_function(HCONNECT connectH, DCMPRECVPROC* func) = 0 ;
virtual int dt_add_recv_function(HDECI deciH, DECIRECVPROC* func) = 0 ;
virtual int dt_delete_recv_function(HDECI deciH) = 0 ;
virtual int dt_send_dcmp(HCONNECT connectH, const char * lparName, BYTE *data, int dataSize) = 0 ;
virtual int dt_set_dcmp_echo_function(HCONNECT connectH, DCMPRECVPROC* func) = 0 ;
static Idtwrap *GetSingleton();
};
#endif // DTLIBWRAPPER_H