diff --git a/utils/MTP/beastpatcher/Makefile b/utils/MTP/beastpatcher/Makefile index edd08b1248..c0c82df53b 100644 --- a/utils/MTP/beastpatcher/Makefile +++ b/utils/MTP/beastpatcher/Makefile @@ -3,20 +3,17 @@ CFLAGS=-Wall -W ifeq ($(findstring CYGWIN,$(shell uname)),CYGWIN) OUTPUT=beastpatcher.exe CROSS= +CFLAGS+=-mno-cygwin else OUTPUT=beastpatcher CROSS=i586-mingw32msvc- endif -ifeq ($(OUTPUT),beastpatcher) LIBS = /usr/lib/libmtp.a /usr/lib/libusb.a CFLAGS += $(shell printf \ '\#include \nlibmtp version: LIBMTP_VERSION\n' | \ gcc -E -P - -o - | grep -q '^libmtp version: 0\.2' && echo '-DOLDMTP') -else -CFLAGS+=-mno-cygwin -LIBS = ../MTP_DLL.dll -endif +WINLIBS = ../MTP_DLL.dll NATIVECC = gcc CC = $(CROSS)gcc @@ -27,8 +24,8 @@ beastpatcher: beastpatcher.c bootimg.c mtp_common.h mtp_libmtp.c gcc $(CFLAGS) -o beastpatcher beastpatcher.c bootimg.c mtp_libmtp.c $(LIBS) strip beastpatcher -beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(LIBS) - $(CROSS)$(CC) $(CFLAGS) $(LIBS) -o beastpatcher.exe beastpatcher.c bootimg.c +beastpatcher.exe: beastpatcher.c bootimg.c mtp_common.h mtp_win32.c $(WINLIBS) + $(CC) $(CFLAGS) -o beastpatcher.exe beastpatcher.c bootimg.c mtp_win32.c $(WINLIBS) $(CROSS)strip beastpatcher.exe beastpatcher-mac: beastpatcher-i386 beastpatcher-ppc diff --git a/utils/MTP/beastpatcher/README b/utils/MTP/beastpatcher/README index 85a039268a..42968b0022 100644 --- a/utils/MTP/beastpatcher/README +++ b/utils/MTP/beastpatcher/README @@ -50,8 +50,6 @@ The OS X build is a universal binary statically linked with libusb and libmtp. Windows ------- -[Not yet implemented] - The MTP_DLL.dll requires VC2005 to compile - see instructions in MTP_DLL/README @@ -59,3 +57,5 @@ To compile beastpatcher itself, you can either cross-compile from Linux using the mingw32 package, or compile in Cygwin. Just type "make beastpatcher.exe" (in Linux) or "make" (in Cygwin). +To run beastpatcher.exe, you need MTP_DLL.dll in the same directory +(or the Windows DLL path). diff --git a/utils/MTP/beastpatcher/beastpatcher.c b/utils/MTP/beastpatcher/beastpatcher.c index 8043ebadc2..0ba324883a 100644 --- a/utils/MTP/beastpatcher/beastpatcher.c +++ b/utils/MTP/beastpatcher/beastpatcher.c @@ -6,7 +6,7 @@ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * - * $Id:$ + * $Id$ * * Copyright (c) 2009, Dave Chapman * All rights reserved. diff --git a/utils/MTP/beastpatcher/mtp_common.h b/utils/MTP/beastpatcher/mtp_common.h index 2fb52a9e81..5f7de3983b 100644 --- a/utils/MTP/beastpatcher/mtp_common.h +++ b/utils/MTP/beastpatcher/mtp_common.h @@ -6,7 +6,7 @@ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * - * $Id:$ + * $Id$ * * Copyright (c) 2009, Dave Chapman * All rights reserved. @@ -41,7 +41,6 @@ #define _MTP_COMMON_H #ifdef __WIN32__ -#error Windows support not yet implemented #else #include "libmtp.h" #endif diff --git a/utils/MTP/beastpatcher/mtp_libmtp.c b/utils/MTP/beastpatcher/mtp_libmtp.c index 7e8579ac99..9ada7bfeea 100644 --- a/utils/MTP/beastpatcher/mtp_libmtp.c +++ b/utils/MTP/beastpatcher/mtp_libmtp.c @@ -6,7 +6,7 @@ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * \/ \/ \/ \/ \/ * - * $Id:$ + * $Id$ * * Copyright (c) 2009, Dave Chapman * All rights reserved. diff --git a/utils/MTP/beastpatcher/mtp_win32.c b/utils/MTP/beastpatcher/mtp_win32.c new file mode 100644 index 0000000000..f68faddbc2 --- /dev/null +++ b/utils/MTP/beastpatcher/mtp_win32.c @@ -0,0 +1,174 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * + * $Id$ + * + * Copyright (c) 2009, Dave Chapman + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + ****************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mtp_common.h" + + +extern __declspec(dllimport) bool send_fw(LPWSTR file, int filesize, + void (*callback)(unsigned int progress, unsigned int max)); + +int mtp_init(struct mtp_info_t* mtp_info) +{ + /* Fill the info struct with zeros - mainly for the strings */ + memset(mtp_info, 0, sizeof(struct mtp_info_t)); + + return 0; + +} + +int mtp_finished(struct mtp_info_t* mtp_info) +{ + (void)mtp_info; + + return 0; +} + +int mtp_scan(struct mtp_info_t* mtp_info) +{ + strcpy(mtp_info->manufacturer,""); + strcpy(mtp_info->modelname,""); + strcpy(mtp_info->version,""); + + return 0; + +} + +static void callback(unsigned int progress, unsigned int max) +{ + int percent = (progress * 100) / max; + + printf("Progress: %u of %u (%d%%)\r", progress, max, percent); + fflush(stdout); +} + + +int mtp_send_firmware(struct mtp_info_t* mtp_info, unsigned char* fwbuf, + int fwsize) +{ + HANDLE hTempFile; + DWORD dwRetVal; + DWORD dwBytesWritten; + UINT uRetVal; + TCHAR szTempName[1024]; + TCHAR lpPathBuffer[1024]; + BOOL fSuccess; + wchar_t *tmp; + int ret; + + (void)mtp_info; + + /* Get the path for temporary files */ + dwRetVal = GetTempPath(sizeof(lpPathBuffer), lpPathBuffer); + if (dwRetVal > sizeof(lpPathBuffer) || (dwRetVal == 0)) + { + fprintf(stderr, "[ERR] GetTempPath failed (%d)\n", (int)GetLastError()); + return -1; + } + + /* Create the temporary file */ + uRetVal = GetTempFileName(lpPathBuffer, TEXT("NKBIN"), 0, szTempName); + if (uRetVal == 0) + { + fprintf(stderr, "[ERR] GetTempFileName failed (%d)\n", (int)GetLastError()); + return -1; + } + + /* Now create the file */ + hTempFile = CreateFile((LPTSTR) szTempName, // file name + GENERIC_READ | GENERIC_WRITE, // open r-w + 0, // do not share + NULL, // default security + CREATE_ALWAYS, // overwrite existing + FILE_ATTRIBUTE_NORMAL,// normal file + NULL); // no template + if (hTempFile == INVALID_HANDLE_VALUE) + { + fprintf(stderr, "[ERR] Could not create %s\n", szTempName); + return -1; + } + + fSuccess = WriteFile(hTempFile, fwbuf, fwsize, &dwBytesWritten, NULL); + if (!fSuccess) + { + fprintf(stderr, "[ERR] WriteFile failed (%d)\n", (int)GetLastError()); + return -1; + } + + fSuccess = CloseHandle (hTempFile); + if (!fSuccess) + { + fprintf(stderr, "[ERR] CloseHandle failed (%d)\n", (int)GetLastError()); + return -1; + } + + tmp = (LPWSTR)malloc(strlen(szTempName)*2+1); + mbstowcs(tmp, szTempName, strlen(szTempName)*2+1); + + fprintf(stderr, "[INFO] Sending firmware...\n"); + if (send_fw(tmp, fwsize, &callback)) + { + fprintf(stderr, "[INFO] Firmware sent successfully\n"); + ret = 0; + } + else + { + fprintf(stderr, "[ERR] Error occured during sending.\n"); + ret = -1; + } + + /* Keep the progress line onscreen */ + printf("\n"); + + free(tmp); + + if (!DeleteFile(szTempName)) + fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName); + + return ret; +}