[ofw] [RFC] [PATCH 2/3] winmad userspace library

Leonid Keller leonid at mellanox.co.il
Wed Jul 2 09:09:17 PDT 2008


A general note.

I'd suggest to change all the types, that are in network order, into
network ones, like it is done in all the stack.
If you don't like IBAL names, define something like
typedef UINT32	UNET32;

Using comments for the fields in the structures (like '// Network byte
order') is not enough error prone, IMO.
You will have parameters and variables, that are to be assigned to these
fields and you will not always look into the structure and notice the
comment.
Also editors and debuggers show you the type of variable, not the
comment ... :(

I'd like to see this change applied to all of your code (WinVerbs,
libumad, drivers ...) 



> -----Original Message-----
> From: ofw-bounces at lists.openfabrics.org 
> [mailto:ofw-bounces at lists.openfabrics.org] On Behalf Of Sean Hefty
> Sent: Wednesday, July 02, 2008 4:51 AM
> To: Hefty, Sean; ofw at lists.openfabrics.org
> Subject: [ofw] [RFC] [PATCH 2/3] winmad userspace library
> 
> Define and implement the winmad interfaces.  The winmad 
> library itself is a fairly simple wrapper around ReadFile and 
> WriteFile, plus a couple of IOCTLs.
> 
> The winmad library is not dependent on other userspace IB or 
> RDMA libraries.  The winmad interfaces are modeled after COM, 
> similar to that defined for winverbs.
> 
> Signed-off-by: Sean Hefty <sean.hefty at intel.com>
> ---
> /*
>  * Copyright (c) 1996-2008 Intel Corporation. All rights reserved.
>  *
>  * This software is available to you under the OpenIB.org BSD license
>  * below:
>  *
>  *     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.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
>  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
> 
> #pragma once
> 
> #ifndef _WINMAD_H_
> #define _WINMAD_H_
> 
> #include <initguid.h>
> 
> #include <unknwn.h>
> 
> 
> typedef struct _WM_REGISTER
> {
> 	UINT64			Guid;
> 	UINT32			Qpn;				
> // Network byte order
> 	UINT8			Port;
> 	UINT8			Class;
> 	UINT8			Version;
> 	UINT8			Reserved[6];
> 	UINT8			Oui[3];
> 	UINT8			Methods[16];
> 
> }	WM_REGISTER;
> 
> typedef struct _WM_MAD_AV
> {
> 	UINT32			Qpn;				
> // Network byte order
> 	UINT32			Qkey;				
> // Network byte order
> 	UINT32			VersionClassFlow;	
> 	UINT16			PkeyIndex;
> 	UINT8			HopLimit;
> 	UINT8			GidIndex;
> 	UINT8			Gid[16];
> 
> 	UINT16			GrhValid;
> 	UINT16			Lid;				
> // Network byte order
> 	UINT8			ServiceLevel;
> 	UINT8			PathBits;
> 	UINT8			StaticRate;
> 	UINT8			Reserved;
> 
> }	WM_MAD_AV;
> 
> #pragma warning(push)
> #pragma warning(disable: 4200)
> typedef struct _WM_MAD
> {
> 	UINT64			Id;
> 	WM_MAD_AV		Address;
> 
> 	UINT32			Status;
> 	UINT32			Timeout;
> 	UINT32			Retries;
> 	UINT32			Length;
> 
> 	UINT8			Data[0];
> 
> }	WM_MAD;
> #pragma warning(pop)
> 
> 
> #undef INTERFACE
> #define INTERFACE IWMProvider
> // {66094220-A6C0-4206-B620-1D766DB2DE63}
> DEFINE_GUID(IID_IWMProvider, 0x66094220, 0xa6c0, 0x4206,
> 			0xb6, 0x20, 0x1d, 0x76, 0x6d, 0xb2, 0xde, 0x63);
> 
> DECLARE_INTERFACE_(IWMProvider, IUnknown) {
> 	// IUnknown methods
> 	__override STDMETHOD(QueryInterface)(
> 		THIS_
> 		REFIID riid,
> 		LPVOID FAR* ppvObj
> 		) PURE;
> 
> 	__override STDMETHOD_(ULONG,AddRef)(
> 		THIS
> 		) PURE;
> 
> 	__override STDMETHOD_(ULONG,Release)(
> 		THIS
> 		) PURE;
> 
> 	// IWVProvider methods
> 	STDMETHOD(CancelOverlappedRequests)(
> 		THIS
> 		) PURE;
> 
> 	STDMETHOD(GetOverlappedResult)(
> 		THIS_
> 		__inout_opt OVERLAPPED *pOverlapped,
> 		__out DWORD *pNumberOfBytesTransferred,
> 		__in BOOL bWait
> 		) PURE;
> 
> 	STDMETHOD_(HANDLE,GetFileHandle)(
> 		THIS
> 		) PURE;
> 
> 	STDMETHOD(Register)(
> 		THIS_
> 		__in WM_REGISTER* pAttributes,
> 		__deref_out UINT64* pId
> 		) PURE;
> 
> 	STDMETHOD(Deregister)(
> 		THIS_
> 		__in UINT64 Id
> 		) PURE;
> 
> 	STDMETHOD(Send)(
> 		THIS_
> 		__in WM_MAD* pMad,
> 		__inout_opt OVERLAPPED *pOverlapped
> 		) PURE;
> 
> 	STDMETHOD(Receive)(
> 		THIS_
> 		__inout_bcount_part(*pBufferSize, *pBufferSize) 
> WM_MAD* pMad,
> 		__in SIZE_T pBufferSize,
> 		__inout_opt OVERLAPPED *pOverlapped
> 		) PURE;
> };
> 
> __declspec(dllexport) HRESULT WmGetObject(REFIID riid, LPVOID 
> FAR* ppvObj);
> 
> #endif // _WINMAD_H_
> 
> /*
>  * Copyright (c) 2008 Intel Corporation. All rights reserved.
>  *
>  * This software is available to you under the OpenIB.org BSD license
>  * below:
>  *
>  *     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.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
>  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
> 
> #pragma once
> 
> #ifndef _WM_IOCTL_H_
> #define _WM_IOCTL_H_
> 
> #define WM_IOCTL(f)	CTL_CODE(FILE_DEVICE_INFINIBAND, f, 
> METHOD_BUFFERED,\
> 							 
> FILE_READ_DATA | FILE_WRITE_DATA)
> 
> // input parameter / output parameter
> // IOCTL
> #define WM_IO_FUNCTION_BASE				0x800
> 
> enum {
> 	WM_IO_FUNCTION_MIN,
> 	WM_IO_FUNCTION_REGISTER,
> 	WM_IO_FUNCTION_DEREGISTER,
> 	WM_IO_FUNCTION_CANCEL,
> 	WM_IO_FUNCTION_MAX
> };
> 
> // WM_IO_REGISTER / UINT64 Id
> #define WM_IOCTL_REGISTER				
> WM_IOCTL(WM_IO_FUNCTION_BASE + \
> 	
> WM_IO_FUNCTION_REGISTER)
> 
> // UINT64 Id / none
> #define WM_IOCTL_DEREGISTER				
> WM_IOCTL(WM_IO_FUNCTION_BASE + \
> 	
> WM_IO_FUNCTION_DEREGISTER)
> 
> // none / none
> #define WM_IOCTL_CANCEL					
> WM_IOCTL(WM_IO_FUNCTION_BASE + \
> 								
> 				 WM_IO_FUNCTION_CANCEL)
> 
> #define WM_IOCTL_MIN					
> WM_IO_FUNCTION_BASE + WM_IO_FUNCTION_MIN
> #define WM_IOCTL_MAX					
> WM_IO_FUNCTION_BASE + WM_IO_FUNCTION_MAX
> 
> typedef struct _WM_IO_REGISTER
> {
> 	UINT64			Guid;
> 	UINT32			Qpn;				
> // Network byte order
> 	UINT8			Port;
> 	UINT8			Class;
> 	UINT8			Version;
> 	UINT8			Reserved[6];
> 	UINT8			Oui[3];
> 	UINT8			Methods[16];
> 
> }	WM_IO_REGISTER;
> 
> typedef struct _WM_IO_MAD_AV
> {
> 	UINT32			Qpn;				
> // Network byte order
> 	UINT32			Qkey;				
> // Network byte order
> 	UINT32			VersionClassFlow;	
> 	UINT16			PkeyIndex;
> 	UINT8			HopLimit;
> 	UINT8			GidIndex;
> 	UINT8			Gid[16];
> 
> 	UINT16			GrhValid;
> 	UINT16			Lid;				
> // Network byte order
> 	UINT8			ServiceLevel;
> 	UINT8			PathBits;
> 	UINT8			StaticRate;
> 	UINT8			Reserved;
> 
> }	WM_IO_MAD_AV;
> 
> #pragma warning(push)
> #pragma warning(disable: 4200)
> typedef struct _WM_IO_MAD
> {
> 	UINT64			Id;
> 	WM_IO_MAD_AV	Address;
> 
> 	UINT32			Status;
> 	UINT32			Timeout;
> 	UINT32			Retries;
> 	UINT32			Length;
> 
> 	UINT8			Data[0];
> 
> }	WM_IO_MAD;
> #pragma warning(pop)
> 
> #endif // _WM_IOCTL_H_
> /*
>  * Copyright (c) 2008 Intel Corporation. All rights reserved.
>  *
>  * This software is available to you under the OpenIB.org BSD license
>  * below:
>  *
>  *     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.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
>  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
> 
> #include "wm_provider.h"
> 
> volatile LONG WmRef;
> 
> BOOLEAN WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, 
> LPVOID lpReserved) {
> 	UNREFERENCED_PARAMETER(hInstance);
> 	UNREFERENCED_PARAMETER(dwReason);
> 	UNREFERENCED_PARAMETER(lpReserved);
> 
> 	return TRUE;
> }
> 
> STDAPI DllCanUnloadNow(void)
> {
> 	return WmRef ? S_FALSE : S_OK;
> }
> 
> __declspec(dllexport) HRESULT WmGetObject(REFIID riid, LPVOID 
> FAR* ppvObj) {
> 	if (riid != IID_IWMProvider) {
> 		*ppvObj = NULL;
> 		return E_NOINTERFACE;
> 	}
> 
> 	return CWMProvider::CreateInstance((IWMProvider **) ppvObj); }
> /*
>  * Copyright (c) 2008 Intel Corporation. All rights reserved.
>  *
>  * This software is available to you under the OpenIB.org BSD license
>  * below:
>  *
>  *     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.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
>  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
> 
> #include <windows.h>
> #include <winioctl.h>
> 
> #include "wm_memory.h"
> #include "wm_provider.h"
> #include "wm_ioctl.h"
> 
> CWMProvider::CWMProvider()
> {
> 	InitializeCriticalSection(&m_CritSecRead);
> 	InitializeCriticalSection(&m_CritSecWrite);
> 	m_OverlapRead.hEvent = NULL;
> 	m_OverlapWrite.hEvent = NULL;
> 	m_nRef = 1;
> 	m_hFile = INVALID_HANDLE_VALUE;
> 	InterlockedIncrement(&WmRef);
> }
> 
> STDMETHODIMP CWMProvider::
> Init(void)
> {
> 	m_OverlapRead.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
> 	m_OverlapWrite.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
> 
> 	return (m_OverlapRead.hEvent != NULL && 
> m_OverlapWrite.hEvent != NULL) ?
> 			NOERROR : E_OUTOFMEMORY;
> }
> 
> CWMProvider::~CWMProvider()
> {
> 	if (m_OverlapRead.hEvent != NULL) {
> 		CloseHandle(m_OverlapWrite.hEvent);
> 	}
> 	if (m_OverlapWrite.hEvent != NULL) {
> 		CloseHandle(m_OverlapWrite.hEvent);
> 	}
> 	CloseHandle(m_hFile);
> 	InterlockedDecrement(&WmRef);
> }
> 
> STDMETHODIMP CWMProvider::
> QueryInterface(REFIID riid, LPVOID FAR* ppvObj) {
> 	if (riid != IID_IUnknown && riid != IID_IWMProvider) {
> 		*ppvObj = NULL;
> 		return E_NOINTERFACE;
> 	}
> 
> 	*ppvObj = this;
> 	AddRef();
> 	return NOERROR;
> }
> 
> STDMETHODIMP_(ULONG) CWMProvider::
> AddRef(void)
> {
> 	return InterlockedIncrement(&m_nRef);
> }
> 
> STDMETHODIMP_(ULONG) CWMProvider::
> Release(void)
> {
> 	ULONG ref;
> 
> 	ref = (ULONG) InterlockedDecrement(&m_nRef);
> 	if (ref == 0) {
> 		Delete();
> 	}
> 	return ref;
> }
> 
> STDMETHODIMP CWMProvider::
> CancelOverlappedRequests(void)
> {
> 	DWORD	bytes;
> 
> 	return WmDeviceIoControl(m_hFile, WM_IOCTL_CANCEL, NULL, 0,
> 							 NULL, 
> 0, &bytes, NULL) ?
> 							 
> NOERROR : HRESULT_FROM_WIN32(GetLastError());
> }
> 
> STDMETHODIMP CWMProvider::
> GetOverlappedResult(OVERLAPPED *pOverlapped,
> 					DWORD 
> *pNumberOfBytesTransferred, BOOL bWait) {
> 	return ::GetOverlappedResult(m_hFile, pOverlapped,
> 								
>  pNumberOfBytesTransferred, bWait); }
> 
> STDMETHODIMP_(HANDLE) CWMProvider::
> GetFileHandle(void)
> {
> 	return m_hFile;
> }
> 
> STDMETHODIMP_(BOOL) CWMProvider::
> WmDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode,
> 				  LPVOID lpInBuffer, DWORD 
> nInBufferSize,
> 				  LPVOID lpOutBuffer, DWORD 
> nOutBufferSize,
> 				  LPDWORD lpBytesReturned, 
> LPOVERLAPPED lpOverlapped) {
> 	BOOL ret;
> 
> 	if (lpOverlapped == NULL) {
> 		EnterCriticalSection(&m_CritSecWrite);
> 		DeviceIoControl(hDevice, dwIoControlCode,
> 						lpInBuffer, 
> nInBufferSize,
> 						lpOutBuffer, 
> nOutBufferSize,
> 						
> lpBytesReturned, &m_OverlapWrite);
> 		ret = GetOverlappedResult(&m_OverlapWrite, 
> lpBytesReturned, TRUE);
> 		LeaveCriticalSection(&m_CritSecWrite);
> 	} else {
> 		ret = DeviceIoControl(hDevice, dwIoControlCode,
> 							  
> lpInBuffer, nInBufferSize,
> 							  
> lpOutBuffer, nOutBufferSize,
> 							  
> lpBytesReturned, lpOverlapped);
> 	}
> 
> 	return ret;
> }
> 
> STDMETHODIMP_(BOOL) CWMProvider::
> WmReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
> 		   LPDWORD lpNumberOfBytesRead, LPOVERLAPPED 
> lpOverlapped) {
> 	BOOL ret;
> 
> 	if (lpOverlapped == NULL) {
> 		EnterCriticalSection(&m_CritSecRead);
> 		ReadFile(hFile, lpBuffer, nNumberOfBytesToRead,
> 				 lpNumberOfBytesRead, &m_OverlapRead);
> 		ret = GetOverlappedResult(&m_OverlapRead, 
> lpNumberOfBytesRead, TRUE);
> 		LeaveCriticalSection(&m_CritSecRead);
> 	} else {
> 		ret = ReadFile(hFile, lpBuffer, nNumberOfBytesToRead,
> 					   lpNumberOfBytesRead, 
> lpOverlapped);
> 	}
> 
> 	return ret;
> }
> 
> STDMETHODIMP_(BOOL) CWMProvider::
> WmWriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD 
> nNumberIfBytesToWrite,
> 			LPDWORD lpNumberOfBytesWritten, 
> LPOVERLAPPED lpOverlapped) {
> 	BOOL ret;
> 
> 	if (lpOverlapped == NULL) {
> 		EnterCriticalSection(&m_CritSecWrite);
> 		WriteFile(hFile, lpBuffer, nNumberIfBytesToWrite,
> 				  lpNumberOfBytesWritten, 
> &m_OverlapWrite);
> 		ret = GetOverlappedResult(&m_OverlapWrite, 
> lpNumberOfBytesWritten, TRUE);
> 		LeaveCriticalSection(&m_CritSecWrite);
> 	} else {
> 		ret = WriteFile(hFile, lpBuffer, nNumberIfBytesToWrite,
> 						
> lpNumberOfBytesWritten, lpOverlapped);
> 	}
> 
> 	return ret;
> }
> 
> STDMETHODIMP CWMProvider::
> Register(WM_REGISTER *pAttributes, UINT64 *pId) {
> 	DWORD bytes;
> 
> 	if (WmDeviceIoControl(m_hFile, WM_IOCTL_REGISTER,
> 						  pAttributes, 
> sizeof WM_REGISTER,
> 						  pId, sizeof 
> UINT64, &bytes, NULL)) {
> 		return NOERROR;
> 	} else {
> 		return HRESULT_FROM_WIN32(GetLastError());
> 	}
> }
> 
> STDMETHODIMP CWMProvider::
> Deregister(UINT64 Id)
> {
> 	DWORD bytes;
> 
> 	if (WmDeviceIoControl(m_hFile, WM_IOCTL_DEREGISTER,
> 						  &Id, sizeof UINT64,
> 						  NULL, 0, 
> &bytes, NULL)) {
> 		return NOERROR;
> 	} else {
> 		return HRESULT_FROM_WIN32(GetLastError());
> 	}
> }
> 
> STDMETHODIMP CWMProvider::
> Send(WM_MAD *pMad, OVERLAPPED *pOverlapped) {
> 	DWORD bytes;
> 
> 	if (WmWriteFile(m_hFile, pMad, (DWORD) sizeof(WM_MAD) + 
> pMad->Length,
> 					&bytes, pOverlapped)) {
> 		return NOERROR;
> 	} else {
> 		return HRESULT_FROM_WIN32(GetLastError());
> 	}
> }
> 
> STDMETHODIMP CWMProvider::
> Receive(WM_MAD *pMad, SIZE_T BufferSize, OVERLAPPED *pOverlapped) {
> 	DWORD bytes;
> 
> 	if (WmReadFile(m_hFile, pMad, (DWORD) BufferSize, 
> &bytes, pOverlapped)) {
> 		return NOERROR;
> 	} else {
> 		return HRESULT_FROM_WIN32(GetLastError());
> 	}
> }
> /*
>  * Copyright (c) 2008 Intel Corporation. All rights reserved.
>  *
>  * This software is available to you under the OpenIB.org BSD license
>  * below:
>  *
>  *     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.
>  *
>  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
>  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AWV
>  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
>  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
>  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
>  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
>  * SOFTWARE.
>  */
> 
> #pragma once
> 
> #ifndef _WM_PROVIDER_H_
> #define _WM_PROVIDER_H_
> 
> #include <iba\winmad.h>
> 
> extern volatile LONG WmRef;
> 
> class CWMProvider : IWMProvider
> {
> public:
> 	// IUnknown methods
> 	STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR* ppvObj);
> 	STDMETHODIMP_(ULONG) AddRef();
> 	STDMETHODIMP_(ULONG) Release();
> 
> 	// IWVProvider methods
> 	STDMETHODIMP CancelOverlappedRequests();
> 	STDMETHODIMP GetOverlappedResult(OVERLAPPED *pOverlapped,
> 								
> 	 DWORD *pNumberOfBytesTransferred, BOOL bWait);
> 
> 	STDMETHODIMP_(HANDLE) GetFileHandle();
> 	STDMETHODIMP Register(WM_REGISTER *pAttributes, UINT64 *pId);
> 	STDMETHODIMP Deregister(UINT64 Id);
> 	STDMETHODIMP Send(WM_MAD *pMad, OVERLAPPED *pOverlapped);
> 	STDMETHODIMP Receive(WM_MAD *pMad, SIZE_T BufferSize, 
> OVERLAPPED *pOverlapped);
> 
> 	STDMETHODIMP_(BOOL) WmDeviceIoControl(HANDLE hDevice, 
> DWORD dwIoControlCode,
> 								
> 		  LPVOID lpInBuffer, DWORD
> nInBufferSize,
> 								
> 		  LPVOID lpOutBuffer, DWORD
> nOutBufferSize,
> 								
> 		  LPDWORD lpBytesReturned,
> 								
> 		  LPOVERLAPPED lpOverlapped);
> 	STDMETHODIMP_(BOOL) WmReadFile(HANDLE hFile, LPVOID lpBuffer,
> 								
>    DWORD nNumberOfBytesToRead,
> 								
>    LPDWORD lpNumberOfBytesRead,
> 								
>    LPOVERLAPPED lpOverlapped);
> 	STDMETHODIMP_(BOOL) WmWriteFile(HANDLE hFile, LPVOID lpBuffer,
> 								
> 	DWORD nNumberIfBytesToWrite,
> 								
> 	LPDWORD lpNumberOfBytesWritten,
> 								
> 	LPOVERLAPPED lpOverlapped);
> 
> 	CWMProvider();
> 	STDMETHODIMP Init();
> 	~CWMProvider();
> 	void Delete() {delete this;}
> 	static STDMETHODIMP CreateInstance(IWMProvider** ppProvider)
> 	{
> 		HRESULT hr;
> 		CWMProvider *wm;
> 
> 		wm = new CWMProvider;
> 		if (wm == NULL) {
> 			hr = E_OUTOFMEMORY;
> 			goto err1;
> 		}
> 
> 		hr = wm->Init();
> 		if (FAILED(hr)) {
> 			goto err2;
> 		}
> 
> 		wm->m_hFile = CreateFileW(L"\\\\.\\WinMad", 
> GENERIC_READ | GENERIC_WRITE,
> 								
>   FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
> 								
>   OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
> 		if (wm->m_hFile == INVALID_HANDLE_VALUE) {
> 			hr = HRESULT_FROM_WIN32(GetLastError());
> 			goto err2;
> 		}
> 		*ppProvider = wm;
> 		return NOERROR;
> 
> 	err2:
> 		wm->Release();
> 	err1:
> 		*ppProvider = NULL;
> 		return hr;
> 	}
> 
> 	HANDLE					m_hFile;
> 	volatile LONG			m_nRef;
> protected:
> 	OVERLAPPED				m_OverlapWrite;
> 	OVERLAPPED				m_OverlapRead;
> 	CRITICAL_SECTION		m_CritSecWrite;
> 	CRITICAL_SECTION		m_CritSecRead;
> };
> 
> #endif // _WM_PROVIDER_H_
> 
> 
> _______________________________________________
> ofw mailing list
> ofw at lists.openfabrics.org
> http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
> 



More information about the ofw mailing list