diff options
Diffstat (limited to 'utils/MTP/beastpatcher/mtp_win32.c')
-rw-r--r-- | utils/MTP/beastpatcher/mtp_win32.c | 464 |
1 files changed, 232 insertions, 232 deletions
diff --git a/utils/MTP/beastpatcher/mtp_win32.c b/utils/MTP/beastpatcher/mtp_win32.c index 7a7c6db769..15d0d705e2 100644 --- a/utils/MTP/beastpatcher/mtp_win32.c +++ b/utils/MTP/beastpatcher/mtp_win32.c @@ -1,232 +1,232 @@ -/***************************************************************************
- * __________ __ ___.
- * 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 <stdio.h>
-#include <string.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <windows.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <tchar.h>
-
-#include "mtp_common.h"
-
-#include "../MTP_DLL/MTP_DLL.h"
-
-
-static int filesize(const char* filename);
-
-
-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)
-{
- wchar_t name[256];
- wchar_t manufacturer[256];
- DWORD version;
- int num = 0;
-
- num = mtp_description(name, manufacturer, &version);
-
- wcstombs(mtp_info->manufacturer, manufacturer, 200);
- wcstombs(mtp_info->modelname, name, 200);
-
- sprintf(mtp_info->version, "%x", (unsigned int)version);
- return (num > 0) ? num : -1;
-
-}
-
-static void callback(unsigned int progress, unsigned int max)
-{
- int percent = (progress * 100) / max;
-
- printf("[INFO] 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(_tcslen(szTempName)*2+1);
- mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1);
-
- fprintf(stderr, "[INFO] Sending firmware...\n");
- if (mtp_sendnk(tmp, fwsize, &callback))
- {
- fprintf(stderr, "\n");
- fprintf(stderr, "[INFO] Firmware sent successfully\n");
- ret = 0;
- }
- else
- {
- fprintf(stderr, "\n");
- fprintf(stderr, "[ERR] Error occured during sending.\n");
- ret = -1;
- }
- free(tmp);
-
- if (!DeleteFile(szTempName))
- fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName);
-
- return ret;
-}
-
-
-int mtp_send_file(struct mtp_info_t* mtp_info, const char* filename)
-{
- wchar_t *fn;
-
- fn = (LPWSTR)malloc(strlen(filename)*2+1);
- mbstowcs(fn, filename, strlen(filename)*2+1);
-
- if (mtp_init(mtp_info) < 0) {
- fprintf(stderr,"[ERR] Can not init MTP\n");
- return 1;
- }
- /* Scan for attached MTP devices. */
- if (mtp_scan(mtp_info) < 0)
- {
- fprintf(stderr,"[ERR] No devices found\n");
- return 1;
- }
-
- fprintf(stderr, "[INFO] Sending firmware...\n");
- if (mtp_sendnk(fn, filesize(filename), &callback))
- {
- /* keep progress on screen */
- printf("\n");
- fprintf(stderr, "[INFO] Firmware sent successfully\n");
- return 0;
- }
- else
- {
- fprintf(stderr, "[ERR] Error occured during sending.\n");
- return -1;
- }
- mtp_finished(mtp_info);
-}
-
-
-static int filesize(const char* filename)
-{
- struct _stat sb;
- int res;
-
- res = _stat(filename, &sb);
- if(res == -1) {
- fprintf(stderr, "Error getting filesize!\n");
- return -1;
- }
- return sb.st_size;
-}
-
+/*************************************************************************** + * __________ __ ___. + * 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 <stdio.h> +#include <string.h> +#include <stddef.h> +#include <stdlib.h> +#include <wchar.h> +#include <windows.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <tchar.h> + +#include "mtp_common.h" + +#include "../MTP_DLL/MTP_DLL.h" + + +static int filesize(const char* filename); + + +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) +{ + wchar_t name[256]; + wchar_t manufacturer[256]; + DWORD version; + int num = 0; + + num = mtp_description(name, manufacturer, &version); + + wcstombs(mtp_info->manufacturer, manufacturer, 200); + wcstombs(mtp_info->modelname, name, 200); + + sprintf(mtp_info->version, "%x", (unsigned int)version); + return (num > 0) ? num : -1; + +} + +static void callback(unsigned int progress, unsigned int max) +{ + int percent = (progress * 100) / max; + + printf("[INFO] 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(_tcslen(szTempName)*2+1); + mbstowcs(tmp, (char*)szTempName, _tcslen(szTempName)*2+1); + + fprintf(stderr, "[INFO] Sending firmware...\n"); + if (mtp_sendnk(tmp, fwsize, &callback)) + { + fprintf(stderr, "\n"); + fprintf(stderr, "[INFO] Firmware sent successfully\n"); + ret = 0; + } + else + { + fprintf(stderr, "\n"); + fprintf(stderr, "[ERR] Error occured during sending.\n"); + ret = -1; + } + free(tmp); + + if (!DeleteFile(szTempName)) + fprintf(stderr,"[WARN] Could not remove temporary file %s\n",szTempName); + + return ret; +} + + +int mtp_send_file(struct mtp_info_t* mtp_info, const char* filename) +{ + wchar_t *fn; + + fn = (LPWSTR)malloc(strlen(filename)*2+1); + mbstowcs(fn, filename, strlen(filename)*2+1); + + if (mtp_init(mtp_info) < 0) { + fprintf(stderr,"[ERR] Can not init MTP\n"); + return 1; + } + /* Scan for attached MTP devices. */ + if (mtp_scan(mtp_info) < 0) + { + fprintf(stderr,"[ERR] No devices found\n"); + return 1; + } + + fprintf(stderr, "[INFO] Sending firmware...\n"); + if (mtp_sendnk(fn, filesize(filename), &callback)) + { + /* keep progress on screen */ + printf("\n"); + fprintf(stderr, "[INFO] Firmware sent successfully\n"); + return 0; + } + else + { + fprintf(stderr, "[ERR] Error occured during sending.\n"); + return -1; + } + mtp_finished(mtp_info); +} + + +static int filesize(const char* filename) +{ + struct _stat sb; + int res; + + res = _stat(filename, &sb); + if(res == -1) { + fprintf(stderr, "Error getting filesize!\n"); + return -1; + } + return sb.st_size; +} + |