Copying files to pda

From NSIS Wiki
Jump to navigationJump to search

Description

This script shows you how to "copy" a file from a desktop machine to a PDA using RAPI. This can be used to copy files other than .cab files. There are better ways to install cab files on a PDA, using CeAppMgr. To use this function you require the rapi.dll, which is installed along with ActiveSync.

The Function

Function createSettingsFile
  ;Init RAPI
 
  ;----------------------
  ;Dll Call Structure
  ;
  ;HRESULT CeRapiInit(void);
  System::Call "rapi::CeRapiInit() i .r0"
 
  ;Create the file on the PDA
 
  ;----------------------
  ;Dll Call Structure
  ;
  ;HANDLE CeCreateFile(
  ;  LPCWSTR lpFileName,
  ;  DWORD dwDesiredAccess,
  ;  DWORD dwShareMode,
  ;  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  ;  DWORD dwCreationDisposition,
  ;  DWORD dwFlagsAndAttributes,
  ;  HANDLE hTemplateFile
  ;);
  ;
  ; Access Mode Values :
  ;       GENERIC_READ = 0x80000000;
  ;       GENERIC_WRITE = 0x40000000;
  ;
  ; Creation Disposition Value :
  ;	CREATE_NEW = 1;
  ;	CREATE_ALWAYS = 2;
  ;	OPEN_EXISTING = 3;	
  ;
  ; Flag and attribute values
  ;	FILE_ATTRIBUTE_NORMAL = 0x80;
  ;	FILE_ATTRIBUTE_DIRECTORY = 0x10;
  ;	FILE_ATTRIBUTE_TEMPORARY = 0x100;
 
  System::Call "rapi::CeCreateFile(w '\filename.txt', i 0x80000000|0x40000000, i 0, i 0, i 2, i 0x80, i 0) i .r10"
 
  ;Write your data across. Can be done in a loop etc.
  FileOpen $0 'FileName' r
  IfErrors done
 
loop:
  FileRead $0 $1
  IfErrors done
 
  ;Get the length of the string read
  StrLen $2 $1
 
  ;----------------------
  ;Dll Call Structure
  ;
  ;BOOL CeWriteFile(
  ;  HANDLE hFile,
  ;  LPCVOID lpBuffer,
  ;  DWORD nNumberOfBytesToWrite,
  ;  LPDWORD lpNumberOfBytesWritten,
  ;  LPOVERLAPPED lpOverlapped
  ;);
  System::Call "rapi::CeWriteFile(i r10., t r1, i r2, *i r3, i 0) i .r11"
  Goto loop
 
  ;----------------------
  ;Dll Call Structure
  ;
  ;BOOL CeCloseHandle( 
  ;  HANDLE hObject
  ;); 
 
  done:
 
  ;Close the file on the PDA
  System::Call "rapi::CeCloseHandle(i r10) i .r1"
 
  ;Close the local file
  FileClose $0
 
  System::Free 0
FunctionEnd

Basically it initialises RAPI, creates the file on the PDA, reads line by line from the local file and writes the file on the PDA!