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

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


Do all the methods of CWMProvider have to be public (WmReadFile,
WmDeviceIoControl)?

You use a critical section in all sync calls.
Does it mean, that if I have an application with 50 threads, which are
sending MADs synchronously, only one thread will work at a time ?

> -----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