diff options
| author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-06-08 18:04:10 +0000 |
|---|---|---|
| committer | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2009-06-08 18:04:10 +0000 |
| commit | eebde2a3676f7dd11011fabd7c4d74f0cb6532d5 (patch) | |
| tree | c8568e4f398f5a1e2fcfc1c937dbbbc18d0f1aeb /utils/MTP/MTP_DLL | |
| parent | 5575f425d64b555ad2399ef6e4ae3d1efcb6627d (diff) | |
| download | rockbox-eebde2a3676f7dd11011fabd7c4d74f0cb6532d5.zip rockbox-eebde2a3676f7dd11011fabd7c4d74f0cb6532d5.tar.gz rockbox-eebde2a3676f7dd11011fabd7c4d74f0cb6532d5.tar.bz2 rockbox-eebde2a3676f7dd11011fabd7c4d74f0cb6532d5.tar.xz | |
Major W32 beastpatcher rework (FS#10220).
Update beastpatcher to scan for the device separately, rework MTP_DLL and modify to allow building with VS2005.
- include pstdint.h when building with VS2005 as VS doesn't have inttypes.h
- don't use bool in the DLL as VS doesn't support type bool in C.
- rearrange DLL files to avoid filename ambiguities with sendfirm.
- include MTP_DLL.h instead of duplicating prototypes. Adjust header for easy inclusion.
- make MTP_DLL project file also copy the resulting dll to MTP folder for convenience.
- extend MTP_DLL API for separate device scanning. Note that this (intentionally) breaks compatibility of the dll.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21221 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'utils/MTP/MTP_DLL')
| -rw-r--r-- | utils/MTP/MTP_DLL/MTP_DLL.h | 13 | ||||
| -rw-r--r-- | utils/MTP/MTP_DLL/MTP_DLL.vcproj | 29 | ||||
| -rw-r--r-- | utils/MTP/MTP_DLL/mtp_wrapper.cpp | 284 | ||||
| -rw-r--r-- | utils/MTP/MTP_DLL/progresshelper.cpp | 104 | ||||
| -rw-r--r-- | utils/MTP/MTP_DLL/progresshelper.h | 52 | ||||
| -rw-r--r-- | utils/MTP/MTP_DLL/sendfirm_win.cpp | 260 |
6 files changed, 463 insertions, 279 deletions
diff --git a/utils/MTP/MTP_DLL/MTP_DLL.h b/utils/MTP/MTP_DLL/MTP_DLL.h index eeee72a..2793c93 100644 --- a/utils/MTP/MTP_DLL/MTP_DLL.h +++ b/utils/MTP/MTP_DLL/MTP_DLL.h @@ -1,10 +1,21 @@ + +#ifndef MTP_DLL_H +#define MTP_DLL_H + #ifdef MTP_DLL_EXPORTS #define MTP_DLL_API __declspec(dllexport) #else #define MTP_DLL_API __declspec(dllimport) #endif +#ifdef __cplusplus extern "C" { - __declspec(dllexport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)); +#endif +MTP_DLL_API int mtp_sendnk(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)); +MTP_DLL_API int mtp_description(wchar_t* name, wchar_t* manufacturer, DWORD* version); +#ifdef __cplusplus } +#endif + +#endif diff --git a/utils/MTP/MTP_DLL/MTP_DLL.vcproj b/utils/MTP/MTP_DLL/MTP_DLL.vcproj index 3d7fa43..644e2e4 100644 --- a/utils/MTP/MTP_DLL/MTP_DLL.vcproj +++ b/utils/MTP/MTP_DLL/MTP_DLL.vcproj @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="8,00"
+ Version="8.00"
Name="MTP_DLL"
ProjectGUID="{C7A39A2D-2ADF-40A3-A9A5-0DF4509B761B}"
RootNamespace="MTP_DLL"
@@ -170,6 +170,7 @@ />
<Tool
Name="VCPostBuildEventTool"
+ CommandLine="echo Copying $(TargetName) dll / lib to ..
copy /Y "$(InputDir)$(ConfigurationName)\$(TargetFileName)" "$(InputDir)..\"
copy /Y "$(InputDir)$(ConfigurationName)\$(TargetName).lib" "$(InputDir)..\""
/>
</Configuration>
</Configurations>
@@ -186,24 +187,12 @@ >
</File>
<File
- RelativePath=".\sendfirm_win.cpp"
+ RelativePath=".\mtp_wrapper.cpp"
+ >
+ </File>
+ <File
+ RelativePath=".\progresshelper.cpp"
>
- <FileConfiguration
- Name="Debug|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="0"
- />
- </FileConfiguration>
- <FileConfiguration
- Name="Release|Win32"
- >
- <Tool
- Name="VCCLCompilerTool"
- UsePrecompiledHeader="0"
- />
- </FileConfiguration>
</File>
<File
RelativePath=".\stdafx.cpp"
@@ -236,6 +225,10 @@ >
</File>
<File
+ RelativePath=".\progresshelper.h"
+ >
+ </File>
+ <File
RelativePath=".\stdafx.h"
>
</File>
diff --git a/utils/MTP/MTP_DLL/mtp_wrapper.cpp b/utils/MTP/MTP_DLL/mtp_wrapper.cpp new file mode 100644 index 0000000..f444a59 --- /dev/null +++ b/utils/MTP/MTP_DLL/mtp_wrapper.cpp @@ -0,0 +1,284 @@ +/* + * Windows MTP Firmware Uploading Implementation + * + * Based on http://opensource.creative.com/mtp_xfer.html + * Edited by Maurus Cuelenaere for Rockbox + * + * Copyright (c) 2009, Maurus Cuelenaere + * 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. + * * Neither the name of the <organization> nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY MAURUS CUELENAERE ''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 MAURUS CUELENAERE 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 "stdafx.h" + +#include <windows.h> +#include "mswmdm_i.c" +#include "mswmdm.h" +#include "sac.h" +#include "scclient.h" + +#include "progresshelper.h" +#include "MTP_DLL.h" + +/* + * Compilation requirements: + * + * Download the Windows Media Format 9.5 SDK + * Add "c:\wmsdk\wmfsdk95\include,c:\wmsdk\wmfsdk95\wmdm\inc" to your inclusion path + * Add "c:\wmsdk\wmfsdk95\lib,c:\wmsdk\wmfsdk95\wmdm\lib" to your library inclusion path + * Link to "mssachlp.lib" + * + */ + +struct mtp_if { + IComponentAuthenticate* pICompAuth; + CSecureChannelClient *pSacClient; + IWMDeviceManager3* pIdvMgr; + bool initialized; +}; + + +extern "C" { +static int mtp_init(struct mtp_if* mtp) +{ + HRESULT hr; + mtp->pSacClient = new CSecureChannelClient; + mtp->pIdvMgr = NULL; + mtp->initialized = false; + + /* these are generic keys */ + BYTE abPVK[] = {0x00}; + BYTE abCert[] = {0x00}; + + CoInitialize(NULL); + + /* get an authentication interface */ + hr = CoCreateInstance(CLSID_MediaDevMgr, NULL, CLSCTX_ALL, + IID_IComponentAuthenticate, (void **)&mtp->pICompAuth); + if SUCCEEDED(hr) + { + /* create a secure channel client certificate */ + hr = mtp->pSacClient->SetCertificate(SAC_CERT_V1, (BYTE*) abCert, + sizeof(abCert), (BYTE*) abPVK, sizeof(abPVK)); + if SUCCEEDED(hr) + { + /* bind the authentication interface to the secure channel client */ + mtp->pSacClient->SetInterface(mtp->pICompAuth); + + /* trigger communication */ + hr = mtp->pSacClient->Authenticate(SAC_PROTOCOL_V1); + if SUCCEEDED(hr) + { + /* get main interface to media device manager */ + hr = mtp->pICompAuth->QueryInterface(IID_IWMDeviceManager2, + (void**)&mtp->pIdvMgr); + if SUCCEEDED(hr) + { + mtp->initialized = true; + } + } + } + } + else { + CoUninitialize(); + } + return mtp->initialized; +} + + +static int mtp_close(struct mtp_if* mtp) +{ + if(mtp->initialized) + { + mtp->pIdvMgr->Release(); + mtp->pICompAuth->Release(); + CoUninitialize(); + mtp->initialized = false; + } + return 0; +} + +__declspec(dllexport) int mtp_description(wchar_t* name, wchar_t* manufacturer, DWORD* version) +{ + HRESULT hr; + int num = 0; + struct mtp_if mtp; + /* zero mtp structure */ + memset(&mtp, 0, sizeof(struct mtp_if)); + + /* initialize interface */ + mtp_init(&mtp); + if(mtp.initialized == false) { + return -1; + } + + /* we now have a media device manager interface... */ + /* enumerate devices... */ + IWMDMEnumDevice *pIEnumDev; + wchar_t pwsString[256]; + hr = mtp.pIdvMgr->EnumDevices2(&pIEnumDev); + if SUCCEEDED(hr) { + hr = pIEnumDev->Reset(); /* Next will now return the first device */ + if SUCCEEDED(hr) { + IWMDMDevice3* pIDevice; + unsigned long ulNumFetched; + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + while (SUCCEEDED(hr) && (hr != S_FALSE)) { + /* output device name */ + hr = pIDevice->GetName(pwsString, 256); + if SUCCEEDED(hr) { + wcsncpy_s(name, 256, pwsString, _TRUNCATE); + num++; + } + /* device manufacturer */ + hr = pIDevice->GetManufacturer(pwsString, 256); + if SUCCEEDED(hr) { + wcsncpy_s(manufacturer, 256, pwsString, _TRUNCATE); + } + /* device version -- optional interface so might fail. */ + DWORD ver; + hr = pIDevice->GetVersion(&ver); + if SUCCEEDED(hr) { + *version = ver; + } + else { + *version = 0; + } + + /* move to next device */ + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + } + pIEnumDev->Release(); + } + mtp_close(&mtp); + } + return (num > 0) ? num : -1; +} + +__declspec(dllexport) int mtp_sendnk(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)) +{ + HRESULT hr; + bool return_value = false; + struct mtp_if mtp; + /* zero mtp structure */ + memset(&mtp, 0, sizeof(struct mtp_if)); + + /* initialize interface */ + mtp_init(&mtp); + if(mtp.initialized == false) { + return false; + } + /* enumerate devices... */ + IWMDMEnumDevice *pIEnumDev; + hr = mtp.pIdvMgr->EnumDevices2(&pIEnumDev); + if SUCCEEDED(hr) + { + hr = pIEnumDev->Reset(); /* Next will now return the first device */ + if SUCCEEDED(hr) + { + IWMDMDevice3* pIDevice; + unsigned long ulNumFetched; + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + while (SUCCEEDED(hr) && (hr != S_FALSE)) + { + /* get storage info */ + DWORD tempDW; + pIDevice->GetType(&tempDW); + if (tempDW & WMDM_DEVICE_TYPE_STORAGE) + { + IWMDMEnumStorage *pIEnumStorage = NULL; + IWMDMStorage *pIStorage = NULL; + IWMDMStorage3 *pIFileStorage = NULL; + hr = pIDevice->EnumStorage(&pIEnumStorage); + if SUCCEEDED(hr) + { + pIEnumStorage->Reset(); + hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); + while (SUCCEEDED(hr) && (hr != S_FALSE)) + { + IWMDMStorage3 *pNewStorage; + hr = pIStorage->QueryInterface(IID_IWMDMStorage3, (void **)&pNewStorage); + if SUCCEEDED(hr) + { + IWMDMStorageControl3 *pIWMDMStorageControl; + hr = pNewStorage->QueryInterface(IID_IWMDMStorageControl3, + (void**)&pIWMDMStorageControl); + if SUCCEEDED(hr) + { + IWMDMMetaData *pIWMDMMetaData = NULL; + hr = pNewStorage->CreateEmptyMetadataObject(&pIWMDMMetaData); + if (SUCCEEDED(hr)) + { + DWORD dw = WMDM_FORMATCODE_UNDEFINEDFIRMWARE; + hr = pIWMDMMetaData->AddItem(WMDM_TYPE_DWORD, g_wszWMDMFormatCode, (BYTE *)&dw, sizeof(dw)); + hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMFileName, (BYTE *)L"nk.bin", 32); + DWORD ow[2]; + ow[0] = filesize; + ow[1] = 0; + hr = pIWMDMMetaData->AddItem(WMDM_TYPE_QWORD, g_wszWMDMFileSize, (BYTE *)ow, 2 * sizeof(dw)); + if (SUCCEEDED(hr)) + { + IWMDMStorage *pNewObject = NULL; + CProgressHelper *progress = new CProgressHelper(callback); + + hr = pIWMDMStorageControl->Insert3( + WMDM_MODE_BLOCK | WMDM_CONTENT_FILE | WMDM_MODE_PROGRESS, + 0, + file, + NULL, + NULL, + (callback == NULL ? NULL : (IWMDMProgress*)progress), + pIWMDMMetaData, + NULL, + (IWMDMStorage **)&pNewObject); + + if(SUCCEEDED(hr) + || hr == WMDM_S_NOT_ALL_PROPERTIES_APPLIED + || hr == WMDM_S_NOT_ALL_PROPERTIES_RETRIEVED) + { + return_value = true; + hr = S_FALSE; + } + } + } + } + } + } + } + pIEnumStorage->Release(); + } + + /* move to next device */ + if(!return_value) + hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); + } + pIEnumDev->Release(); + } + mtp_close(&mtp); + } + return return_value ? 1 : 0; +} + +}
\ No newline at end of file diff --git a/utils/MTP/MTP_DLL/progresshelper.cpp b/utils/MTP/MTP_DLL/progresshelper.cpp new file mode 100644 index 0000000..a8aac36 --- /dev/null +++ b/utils/MTP/MTP_DLL/progresshelper.cpp @@ -0,0 +1,104 @@ +/* + * Windows MTP Firmware Uploading Implementation + * + * Based on http://opensource.creative.com/mtp_xfer.html + * Edited by Maurus Cuelenaere for Rockbox + * + * Copyright (c) 2009, Maurus Cuelenaere + * 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. + * * Neither the name of the <organization> nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY MAURUS CUELENAERE ''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 MAURUS CUELENAERE 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 "stdafx.h" + +#include <windows.h> +#include "mswmdm_i.c" +#include "mswmdm.h" +#include "sac.h" +#include "scclient.h" + +#include "progresshelper.h" + + + + +CProgressHelper::CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ) +{ + m_cur_ticks = 0; + m_max_ticks = 0; + m_counter = 0; + + m_callback = callback; +} + +CProgressHelper::~CProgressHelper() +{ +} + +HRESULT CProgressHelper::Begin( DWORD dwEstimatedTicks ) +{ + m_max_ticks = dwEstimatedTicks; + + return S_OK; +} + +HRESULT CProgressHelper::Progress( DWORD dwTranspiredTicks ) +{ + m_cur_ticks = dwTranspiredTicks; + + if(m_callback != NULL) + m_callback(m_cur_ticks, max(m_max_ticks, m_cur_ticks)); + + return S_OK; +} + +HRESULT CProgressHelper::End() +{ + m_cur_ticks = m_max_ticks; + + return S_OK; +} + +HRESULT CProgressHelper::QueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ) +{ + if(riid == IID_IWMDMProgress || riid == IID_IUnknown) + { + *ppvObject = this; + return S_OK; + } + else + { + *ppvObject = NULL; + return E_NOINTERFACE; + } +} + +ULONG CProgressHelper::AddRef() +{ + return m_counter++; +} +ULONG CProgressHelper::Release() +{ + return m_counter--; +} diff --git a/utils/MTP/MTP_DLL/progresshelper.h b/utils/MTP/MTP_DLL/progresshelper.h new file mode 100644 index 0000000..ac54095 --- /dev/null +++ b/utils/MTP/MTP_DLL/progresshelper.h @@ -0,0 +1,52 @@ +/* + * Windows MTP Firmware Uploading Implementation + * + * Based on http://opensource.creative.com/mtp_xfer.html + * Edited by Maurus Cuelenaere for Rockbox + * + * Copyright (c) 2009, Maurus Cuelenaere + * 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. + * * Neither the name of the <organization> nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY MAURUS CUELENAERE ''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 MAURUS CUELENAERE 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. + */ + +class CProgressHelper : + public IWMDMProgress +{ + void (*m_callback)(unsigned int progress, unsigned int max); + DWORD m_max_ticks; + DWORD m_cur_ticks; + DWORD m_counter; + +public: + CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ); + ~CProgressHelper(); + STDMETHOD(Begin)( DWORD dwEstimatedTicks ); + STDMETHOD(Progress)( DWORD dwTranspiredTicks ); + STDMETHOD(End)(); + + STDMETHOD(QueryInterface) ( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ); + STDMETHOD_(ULONG, AddRef)( void ); + STDMETHOD_(ULONG, Release)( void ); +}; + diff --git a/utils/MTP/MTP_DLL/sendfirm_win.cpp b/utils/MTP/MTP_DLL/sendfirm_win.cpp deleted file mode 100644 index 6f9cf24..0000000 --- a/utils/MTP/MTP_DLL/sendfirm_win.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Windows MTP Firmware Uploading Implementation - * - * Based on http://opensource.creative.com/mtp_xfer.html - * Edited by Maurus Cuelenaere for Rockbox - * - * Copyright (c) 2009, Maurus Cuelenaere - * 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. - * * Neither the name of the <organization> nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY MAURUS CUELENAERE ''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 MAURUS CUELENAERE 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 <windows.h> -#include "mswmdm_i.c" -#include "mswmdm.h" -#include "sac.h" -#include "scclient.h" - -class CProgressHelper : - public IWMDMProgress -{ - void (*m_callback)(unsigned int progress, unsigned int max); - DWORD m_max_ticks; - DWORD m_cur_ticks; - DWORD m_counter; - -public: - CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ); - ~CProgressHelper(); - STDMETHOD(Begin)( DWORD dwEstimatedTicks ); - STDMETHOD(Progress)( DWORD dwTranspiredTicks ); - STDMETHOD(End)(); - - STDMETHOD(QueryInterface) ( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ); - STDMETHOD_(ULONG, AddRef)( void ); - STDMETHOD_(ULONG, Release)( void ); -}; - -/* - * Compilation requirements: - * - * Download the Windows Media Format 9.5 SDK - * Add "c:\wmsdk\wmfsdk95\include,c:\wmsdk\wmfsdk95\wmdm\inc" to your inclusion path - * Add "c:\wmsdk\wmfsdk95\lib,c:\wmsdk\wmfsdk95\wmdm\lib" to your library inclusion path - * Link to "mssachlp.lib" - * - */ -extern "C" { -__declspec(dllexport) bool send_fw(LPWSTR file, int filesize, void (*callback)(unsigned int progress, unsigned int max)) -{ - bool return_value = false; - HRESULT hr; - IComponentAuthenticate* pICompAuth; - CSecureChannelClient *m_pSacClient = new CSecureChannelClient; - IWMDeviceManager3* m_pIdvMgr = NULL; - - /* these are generic keys */ - BYTE abPVK[] = {0x00}; - BYTE abCert[] = {0x00}; - - CoInitialize(NULL); - - /* get an authentication interface */ - hr = CoCreateInstance(CLSID_MediaDevMgr, NULL, CLSCTX_ALL ,IID_IComponentAuthenticate, (void **)&pICompAuth); - if SUCCEEDED(hr) - { - /* create a secure channel client certificate */ - hr = m_pSacClient->SetCertificate(SAC_CERT_V1, (BYTE*) abCert, sizeof(abCert), (BYTE*) abPVK, sizeof(abPVK)); - if SUCCEEDED(hr) - { - /* bind the authentication interface to the secure channel client */ - m_pSacClient->SetInterface(pICompAuth); - - /* trigger communication */ - hr = m_pSacClient->Authenticate(SAC_PROTOCOL_V1); - if SUCCEEDED(hr) - { - /* get main interface to media device manager */ - hr = pICompAuth->QueryInterface(IID_IWMDeviceManager2, (void**)&m_pIdvMgr); - if SUCCEEDED(hr) - { - /* enumerate devices... */ - IWMDMEnumDevice *pIEnumDev; - hr = m_pIdvMgr->EnumDevices2(&pIEnumDev); - if SUCCEEDED(hr) - { - hr = pIEnumDev->Reset(); /* Next will now return the first device */ - if SUCCEEDED(hr) - { - IWMDMDevice3* pIDevice; - unsigned long ulNumFetched; - hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); - while (SUCCEEDED(hr) && (hr != S_FALSE)) - { - /* get storage info */ - DWORD tempDW; - pIDevice->GetType(&tempDW); - if (tempDW & WMDM_DEVICE_TYPE_STORAGE) - { - IWMDMEnumStorage *pIEnumStorage = NULL; - IWMDMStorage *pIStorage = NULL; - IWMDMStorage3 *pIFileStorage = NULL; - hr = pIDevice->EnumStorage(&pIEnumStorage); - if SUCCEEDED(hr) - { - pIEnumStorage->Reset(); - hr = pIEnumStorage->Next(1, (IWMDMStorage **)&pIStorage, &ulNumFetched); - while (SUCCEEDED(hr) && (hr != S_FALSE)) - { - IWMDMStorage3 *pNewStorage; - hr = pIStorage->QueryInterface(IID_IWMDMStorage3, (void **)&pNewStorage); - if SUCCEEDED(hr) - { - IWMDMStorageControl3 *pIWMDMStorageControl; - hr = pNewStorage->QueryInterface(IID_IWMDMStorageControl3, - (void**)&pIWMDMStorageControl); - if SUCCEEDED(hr) - { - IWMDMMetaData *pIWMDMMetaData = NULL; - hr = pNewStorage->CreateEmptyMetadataObject(&pIWMDMMetaData); - if (SUCCEEDED(hr)) - { - DWORD dw = WMDM_FORMATCODE_UNDEFINEDFIRMWARE; - hr = pIWMDMMetaData->AddItem(WMDM_TYPE_DWORD, g_wszWMDMFormatCode, (BYTE *)&dw, sizeof(dw)); - hr = pIWMDMMetaData->AddItem(WMDM_TYPE_STRING, g_wszWMDMFileName, (BYTE *)L"nk.bin", 32); - DWORD ow[2]; - ow[0] = filesize; - ow[1] = 0; - hr = pIWMDMMetaData->AddItem(WMDM_TYPE_QWORD, g_wszWMDMFileSize, (BYTE *)ow, 2 * sizeof(dw)); - if (SUCCEEDED(hr)) - { - IWMDMStorage *pNewObject = NULL; - CProgressHelper *progress = new CProgressHelper(callback); - - hr = pIWMDMStorageControl->Insert3( - WMDM_MODE_BLOCK | WMDM_CONTENT_FILE | WMDM_MODE_PROGRESS, - 0, - file, - NULL, - NULL, - (callback == NULL ? NULL : (IWMDMProgress*)progress), - pIWMDMMetaData, - NULL, - (IWMDMStorage **)&pNewObject); - - if(SUCCEEDED(hr) || hr == WMDM_S_NOT_ALL_PROPERTIES_APPLIED - || hr == WMDM_S_NOT_ALL_PROPERTIES_RETRIEVED) - { - return_value = true; - hr = S_FALSE; - } - } - } - } - } - } - } - pIEnumStorage->Release(); - } - - /* move to next device */ - if(!return_value) - hr = pIEnumDev->Next(1, (IWMDMDevice **)&pIDevice, &ulNumFetched); - } - pIEnumDev->Release(); - } - m_pIdvMgr->Release(); - } - pICompAuth->Release(); - } - } - } - } - - CoUninitialize(); - - return return_value; -} -} - - -CProgressHelper::CProgressHelper( void (*callback)(unsigned int progress, unsigned int max) ) -{ - m_cur_ticks = 0; - m_max_ticks = 0; - m_counter = 0; - - m_callback = callback; -} - -CProgressHelper::~CProgressHelper() -{ -} - -HRESULT CProgressHelper::Begin( DWORD dwEstimatedTicks ) -{ - m_max_ticks = dwEstimatedTicks; - - return S_OK; -} - -HRESULT CProgressHelper::Progress( DWORD dwTranspiredTicks ) -{ - m_cur_ticks = dwTranspiredTicks; - - if(m_callback != NULL) - m_callback(m_cur_ticks, max(m_max_ticks, m_cur_ticks)); - - return S_OK; -} - -HRESULT CProgressHelper::End() -{ - m_cur_ticks = m_max_ticks; - - return S_OK; -} - -HRESULT CProgressHelper::QueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject ) -{ - if(riid == IID_IWMDMProgress || riid == IID_IUnknown) - { - *ppvObject = this; - return S_OK; - } - else - { - *ppvObject = NULL; - return E_NOINTERFACE; - } -} - -ULONG CProgressHelper::AddRef() -{ - return m_counter++; -} -ULONG CProgressHelper::Release() -{ - return m_counter--; -} |