On 23/01/13 13:37, Xiaofan Chen wrote:
1) Windows CE USB Wrapper:
https://github.com/RealVNC/CEUSBKWrapper
If you're building for a WinCE 5.0 system then you'll have trouble. The big
(and hopefully only) issue is that between WinCE 5.0 and WinCE 6.0 the
method for kernel code to access user memory changed significantly.
Currently the UserBuffer.cpp file only has an implementation for the WinCE
6.0 API. I'll see if I can track down a WinCE 5.0 baseport, but if I can't,
would it be possible for you to try a patch if I provide it?
Yes I can try the patch.
I appreciate that this is 2 months later. But I've finally found the
spare time to try to add WinCE 5 support to CEUSBKwrapper.
I've attached a couple of patches. Don't feel any pressure to try them.
If you do find some time to try them out then let me know how you get on.
Depending on what USB devices you want to test with the driver you might
want to add some extra PIDs and VIDs to:
ceusbkwrapper\drv\ceusbkwrapperdrv.reg
Regards,
Toby
>From a05f844eaa30f92ab285e3bc41c746fb93d1bcd0 Mon Sep 17 00:00:00 2001
From: Toby Gray <toby.g...@realvnc.com>
Date: Wed, 23 Jan 2013 11:39:26 +0000
Subject: [PATCH 1/2] drv: Removing dubious use of "1" as a pointer in sizeof.
---
drv/Transfer.cpp | 2 +-
drv/UserBuffer.cpp | 2 +-
drv/UserBuffer.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/drv/Transfer.cpp b/drv/Transfer.cpp
index 43dd16e..52ad27d 100644
--- a/drv/Transfer.cpp
+++ b/drv/Transfer.cpp
@@ -57,7 +57,7 @@ Transfer::Transfer(
lpUserBuffer, dwUserBufferSize)
, mBytesTransferredBuffer(
AccessFlagsForBytesTransferredBuffer(dwFlags, lpUserOverlapped),
- lpUserBytesTransferred)
+ lpUserBytesTransferred, sizeof(DWORD))
, mOverlappedBuffer(lpUserOverlapped)
{
mOpenContext->GetTransferList()->RegisterTransfer(this);
diff --git a/drv/UserBuffer.cpp b/drv/UserBuffer.cpp
index e89dca9..d0318e8 100644
--- a/drv/UserBuffer.cpp
+++ b/drv/UserBuffer.cpp
@@ -177,7 +177,7 @@ template class UserBuffer<LPDWORD>;
template class UserBuffer<LPOVERLAPPED>;
OverlappedUserBuffer::OverlappedUserBuffer(LPOVERLAPPED lpOverlapped)
-: UserBuffer<LPOVERLAPPED>(UBA_WRITE | UBA_ASYNC, lpOverlapped)
+: UserBuffer<LPOVERLAPPED>(UBA_WRITE | UBA_ASYNC, lpOverlapped, sizeof(OVERLAPPED))
, mhEvent(INVALID_HANDLE_VALUE)
, mCompleted(FALSE)
{
diff --git a/drv/UserBuffer.h b/drv/UserBuffer.h
index 1ab718e..496d417 100644
--- a/drv/UserBuffer.h
+++ b/drv/UserBuffer.h
@@ -38,7 +38,7 @@ public:
UserBuffer(
DWORD dwAccessFlags,
T lpSrcUnmarshalled,
- DWORD dwSize = sizeof(*(reinterpret_cast<T>(1))));
+ DWORD dwSize);
~UserBuffer();
BOOL Valid() const;
T UserPtr();
--
1.7.9
>From 72510484bfabebbe560b9b8af7b47f7589c2ba32 Mon Sep 17 00:00:00 2001
From: Toby Gray <toby.g...@realvnc.com>
Date: Fri, 22 Mar 2013 15:18:32 +0000
Subject: [PATCH 2/2] drv: Adding prototype WinCE 5 support to driver.
---
drv/UserBuffer.cpp | 177 +++++++++++++++++++++++++++++++++++++++++----------
drv/UserBuffer.h | 2 +
2 files changed, 144 insertions(+), 35 deletions(-)
diff --git a/drv/UserBuffer.cpp b/drv/UserBuffer.cpp
index d0318e8..c9f8e6f 100644
--- a/drv/UserBuffer.cpp
+++ b/drv/UserBuffer.cpp
@@ -26,6 +26,9 @@
#include <ceddk.h>
#include <memory>
+#if _WIN32_WCE >= 0x600
+/* WinCE 6 and beyond support */
+
template<typename T>
UserBuffer<T>::UserBuffer(
DWORD dwAccessFlags,
@@ -83,30 +86,6 @@ UserBuffer<T>::~UserBuffer()
}
template<typename T>
-BOOL UserBuffer<T>::Valid() const
-{
- return mSize == 0 ||
- !mlpSrcUnmarshalled ||
- (mlpAsyncMarshalled && mAsync) ||
- (mlpSyncMarshalled && !mAsync);
-}
-
-template<typename T>
-T UserBuffer<T>::UserPtr()
-{
- return static_cast<T>(mlpSrcUnmarshalled);
-}
-
-template<typename T>
-T UserBuffer<T>::Ptr()
-{
- return static_cast<T>(
- mAsync ?
- mlpAsyncMarshalled :
- mlpSyncMarshalled);
-}
-
-template<typename T>
BOOL UserBuffer<T>::Flush()
{
if (mSize == 0) {
@@ -126,12 +105,6 @@ BOOL UserBuffer<T>::Flush()
}
template<typename T>
-DWORD UserBuffer<T>::Size()
-{
- return mSize;
-}
-
-template<typename T>
DWORD UserBuffer<T>::ArgDescFromAccessFlags(DWORD dwAccessFlags)
{
DWORD ret;
@@ -171,11 +144,6 @@ DWORD UserBuffer<LPDWORD>::ArgDescFromAccessFlags(DWORD dwAccessFlags)
return ret;
}
-// Create versions of UserBuffer for supported types
-template class UserBuffer<LPVOID>;
-template class UserBuffer<LPDWORD>;
-template class UserBuffer<LPOVERLAPPED>;
-
OverlappedUserBuffer::OverlappedUserBuffer(LPOVERLAPPED lpOverlapped)
: UserBuffer<LPOVERLAPPED>(UBA_WRITE | UBA_ASYNC, lpOverlapped, sizeof(OVERLAPPED))
, mhEvent(INVALID_HANDLE_VALUE)
@@ -197,6 +165,145 @@ OverlappedUserBuffer::OverlappedUserBuffer(LPOVERLAPPED lpOverlapped)
Flush();
}
+#else /* _WIN32_WCE >= 0x600 */
+/* WinCE 5 and below support */
+
+template<typename T>
+UserBuffer<T>::UserBuffer(
+ DWORD dwAccessFlags,
+ T lpSrcUnmarshalled,
+ DWORD dwSize)
+: mlpSrcUnmarshalled(lpSrcUnmarshalled)
+, mSize(dwSize)
+, mAsync((dwAccessFlags & UBA_ASYNC) == UBA_ASYNC)
+, mArgDesc(ArgDescFromAccessFlags(dwAccessFlags))
+, mlpSyncMarshalled(NULL)
+, mlpAsyncMarshalled(NULL)
+{
+ if (!mlpSrcUnmarshalled)
+ return;
+ if (mSize == 0)
+ return;
+ mlpSyncMarshalled = MapCallerPtr(lpSrcUnmarshalled, mSize);
+ if (!mlpSyncMarshalled) {
+ ERROR_MSG((TEXT("USBKWrapperDrv!UserBuffer::UserBuffer() failed to map caller buffer 0x%08x\r\n"),
+ lpSrcUnmarshalled));
+ mlpSyncMarshalled = NULL;
+ }
+ if (mlpSyncMarshalled != NULL && mAsync) {
+ mlpAsyncMarshalled = malloc(mSize);
+ if (!mlpAsyncMarshalled) {
+ ERROR_MSG((TEXT("USBKWrapperDrv!UserBuffer::UserBuffer() failed to alloc async buffer 0x%08x\r\n"),
+ lpSrcUnmarshalled));
+ mlpAsyncMarshalled = NULL;
+ } else {
+ /* MapCallerPtr has checked that this is a valid user space region. */
+ memcpy(mlpAsyncMarshalled, mlpSyncMarshalled, mSize);
+ }
+ }
+}
+
+template<typename T>
+UserBuffer<T>::~UserBuffer()
+{
+ if (mlpAsyncMarshalled != NULL) {
+ free(mlpAsyncMarshalled);
+ mlpAsyncMarshalled = NULL;
+ }
+}
+
+
+template<typename T>
+BOOL UserBuffer<T>::Flush()
+{
+ if (mSize == 0) {
+ return TRUE;
+ }
+ if (mlpAsyncMarshalled == NULL) {
+ return !mAsync;
+ }
+ /* Switch back to the callers permissions and then memcpy the data back */
+ const DWORD oldPermissions = SetProcPermissions(mArgDesc);
+ memcpy(mlpSyncMarshalled, mlpAsyncMarshalled, mSize);
+ DWORD argDesc = SetProcPermissions(oldPermissions);
+ BOOL ret = TRUE;
+ if (argDesc != mArgDesc) {
+ ERROR_MSG((TEXT("USBKWrapperDrv!UserBuffer::Flush failed to flush async buffer %d != %d\r\n"),
+ argDesc, mArgDesc));
+ ret = FALSE;
+ }
+ return ret;
+}
+
+template<typename T>
+DWORD UserBuffer<T>::ArgDescFromAccessFlags(DWORD dwAccessFlags)
+{
+ return GetCurrentPermissions();
+}
+
+OverlappedUserBuffer::OverlappedUserBuffer(LPOVERLAPPED lpOverlapped)
+: UserBuffer<LPOVERLAPPED>(UBA_WRITE | UBA_ASYNC, lpOverlapped, sizeof(OVERLAPPED))
+, mhEvent(INVALID_HANDLE_VALUE)
+, mCompleted(FALSE)
+{
+ if (!Valid() || Ptr() == NULL)
+ return;
+ /* Need to duplicate the handle into kernel space */
+ BOOL success = DuplicateHandle(
+ GetOwnerProcess(), operator->().hEvent,
+ GetCurrentProcess(), &mhEvent,
+ 0, FALSE, DUPLICATE_SAME_ACCESS);
+ if (!success) {
+ ERROR_MSG((TEXT("USBKWrapperDrv!OverlappedUserBuffer::OverlappedUserBuffer failed to duplicate handle\r\n")));
+ mhEvent = INVALID_HANDLE_VALUE;
+ return;
+ }
+ // Set the status as pending
+ operator->().Internal = STATUS_PENDING;
+ operator->().InternalHigh = 0;
+ // Write the changes back to userspace
+ Flush();
+}
+
+
+#endif /* _WIN32_WCE >= 0x600 */
+/* Generic functions common to any WinCE version */
+
+template<typename T>
+BOOL UserBuffer<T>::Valid() const
+{
+ return mSize == 0 ||
+ !mlpSrcUnmarshalled ||
+ (mlpAsyncMarshalled && mAsync) ||
+ (mlpSyncMarshalled && !mAsync);
+}
+
+template<typename T>
+T UserBuffer<T>::UserPtr()
+{
+ return static_cast<T>(mlpSrcUnmarshalled);
+}
+
+template<typename T>
+T UserBuffer<T>::Ptr()
+{
+ return static_cast<T>(
+ mAsync ?
+ mlpAsyncMarshalled :
+ mlpSyncMarshalled);
+}
+
+template<typename T>
+DWORD UserBuffer<T>::Size()
+{
+ return mSize;
+}
+
+// Create versions of UserBuffer for supported types
+template class UserBuffer<LPVOID>;
+template class UserBuffer<LPDWORD>;
+template class UserBuffer<LPOVERLAPPED>;
+
OverlappedUserBuffer::~OverlappedUserBuffer()
{
if (!Completed() && Valid()) {
diff --git a/drv/UserBuffer.h b/drv/UserBuffer.h
index 496d417..f763e2c 100644
--- a/drv/UserBuffer.h
+++ b/drv/UserBuffer.h
@@ -51,6 +51,8 @@ private:
const LPVOID mlpSrcUnmarshalled;
const DWORD mSize;
const BOOL mAsync;
+ /* For WinCE > 6 this is the marshalled type information.
+ * For WinCE < 6 this is the calling thread permissions. */
const DWORD mArgDesc;
LPVOID mlpSyncMarshalled;
LPVOID mlpAsyncMarshalled;
--
1.7.9
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_mar
_______________________________________________
libusbx-devel mailing list
libusbx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/libusbx-devel