// 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 Microsoft’s 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 wouldn’t 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 // #include // 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