⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 portlist.cpp

📁 Windows print spooler Driver development source
💻 CPP
字号:
// PortList.cpp
//
//////////////////////////////////////////////////////////////////////

#include "PortList.h"

//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////

CPortList::CPortList(TCHAR *sMonitorName,TCHAR *sPortDesc)
{
	if(sMonitorName)
		m_sMonitorName=_tcsdup(sMonitorName);
	else
		m_sMonitorName=_tcsdup(_T(""));

	if(sPortDesc)
		m_sPortDesc=_tcsdup(sPortDesc);
	else
		m_sPortDesc=_tcsdup(_T(""));
	
	// Lege Pseudo-Knoten an
	m_pFirst=new PORT;
	
	m_pFirst->pNext=NULL;
	m_pFirst->dwStatus=0;
	m_pFirst->hFile=0;
	m_pFirst->dwJobID=0;

	_tcscpy(m_pFirst->sPath,_T(""));
	_tcscpy(m_pFirst->sCurDocument,_T(""));
	_tcscpy(m_pFirst->sPrinter,_T(""));
}

CPortList::~CPortList()
{
	free(m_sMonitorName);
	free(m_sPortDesc);

	// Loesche alle Knoten
	PORT *pNext;
	while(m_pFirst)
	{
		pNext=m_pFirst->pNext;
		delete m_pFirst;
		m_pFirst=pNext;
	}
}

//////////////////////////////////////////////////////////////////////
// Konstruktion/Destruktion
//////////////////////////////////////////////////////////////////////

BOOL CPortList::EnumPorts(
	LPWSTR   pName,
	DWORD   Level,
	LPBYTE  pPorts,
	DWORD   cbBuf,
	LPDWORD pcbNeeded,
	LPDWORD pcReturned)
{
    LPBYTE  pEnd;
    DWORD   LastError=0;

	//EnterSplSem();

    DWORD cb=0;

	PORT *pPort=m_pFirst;
    while (pPort->pNext)
	{
        cb+=GetPortSize(pPort->sPath, Level);
        pPort=pPort->pNext;
    }

    *pcbNeeded=cb;

    if (cb <= cbBuf)
	{
        //Buffer ist gross genug
		pEnd=pPorts+cbBuf;
        *pcReturned=0;

        pPort=m_pFirst;
        while (pPort->pNext)
		{
            pEnd = CopyPortToBuffer(pPort, Level, pPorts, pEnd);

            switch (Level)
			{
            case 1:
                pPorts+=sizeof(PORT_INFO_1);
                break;
            case 2:
                pPorts+=sizeof(PORT_INFO_2);
                break;
            default:
                LastError = ERROR_INVALID_LEVEL;
                goto Cleanup;
            }//switch
            (*pcReturned)++;

            pPort=pPort->pNext;
        }//while pPort->pNext

    }
	else
	{
		//Buffer nicht gross genug
        LastError = ERROR_INSUFFICIENT_BUFFER;
	}

Cleanup:
//   LeaveSplSem();

    if (LastError)
	{
        SetLastError(LastError);
        return FALSE;
    }
	else
	{
		return TRUE;
	}
}

DWORD CPortList::GetPortSize(
	TCHAR *pName,
	DWORD dwLevel)
{
    DWORD   cb;
    
    switch (dwLevel) {

    case 1:

        cb=sizeof(PORT_INFO_1) +
			_tcslen(pName)*sizeof(TCHAR) + 
			sizeof(TCHAR);
        break;

    case 2:
        cb = _tcslen(pName) + 1 +
             _tcslen(m_sMonitorName) + 1 +
             _tcslen(m_sPortDesc) + 1;
        cb *= sizeof(TCHAR);
        cb += sizeof(PORT_INFO_2);
        break;

    default:
        cb = 0;
        break;
    }

    return cb;
}

LPBYTE CPortList::CopyPortToBuffer(
	PORT *pPort,
	DWORD dwLevel,
	LPBYTE pStart,
	LPBYTE pEnd)
{
	switch(dwLevel)
	{
	case 1:
		{
			PORT_INFO_1 *pPortInfo=(PORT_INFO_1*)pStart;
			pEnd-=_tcslen(pPort->sPath) * sizeof(TCHAR) + sizeof(TCHAR);
			pPortInfo->pName=_tcscpy((TCHAR*)pEnd,pPort->sPath);
			
			break;
		}
	case 2:
		{
			PORT_INFO_2 *pPortInfo=(PORT_INFO_2*)pStart;
			pEnd-=_tcslen(m_sMonitorName) * sizeof(TCHAR) + sizeof(TCHAR);
			pPortInfo->pMonitorName=_tcscpy((TCHAR*)pEnd,m_sMonitorName);

			pEnd-=_tcslen(m_sPortDesc) * sizeof(TCHAR) + sizeof(TCHAR);
			pPortInfo->pDescription=_tcscpy((TCHAR*)pEnd,m_sPortDesc);

			pEnd-=_tcslen(pPort->sPath) * sizeof(TCHAR) + sizeof(TCHAR);
			pPortInfo->pPortName=_tcscpy((TCHAR*)pEnd,pPort->sPath);

			pPortInfo->fPortType=0;
			pPortInfo->Reserved=0;

			break;
		}
	default:
		MessageBox(0,_T("Error"),_T("invalid level"),MB_OK);
	}//switch

    return pEnd;
}

BOOL CPortList::AddPort(TCHAR *sPath, DWORD dwStatus)
{
	PORT *pNew=new PORT;
	
	if(!pNew)
		return FALSE;

	pNew->pNext=m_pFirst;
	pNew->dwStatus=dwStatus;
	pNew->hFile=0;
	pNew->dwJobID=0;

	_tcscpy(pNew->sPath,sPath);
	_tcscpy(pNew->sCurDocument,_T(""));
	_tcscpy(pNew->sPrinter,_T(""));

	m_pFirst=pNew;

	return TRUE;
}

void CPortList::Save(TCHAR *sRoot)
{
	HKEY hKey;

	// Registry-Key oeffnen
	if(RegOpenKeyEx(
		HKEY_LOCAL_MACHINE,
		sRoot,
		0,
		KEY_SET_VALUE | KEY_READ,
		&hKey) != ERROR_SUCCESS)
			return;

	// Alle vorhandenen Ports loeschen
	DWORD z;
	TCHAR sPort[5];

	z=1;
	do
	{
		_ultot(z++,sPort,10);
	}while(RegDeleteValue(hKey,sPort)==ERROR_SUCCESS);

	// Ports schreiben
	PORT *pPort=m_pFirst;

	z=Count();
	while(pPort->pNext)
	{
		_ultot(z--,sPort,10);

		RegSetValueEx(
			hKey,
			sPort,					//value name
			0,						//reserved
			REG_SZ,					//typ
			(BYTE*)pPort->sPath,	//value
			_tcslen(pPort->sPath)*sizeof(TCHAR));
		

		pPort=pPort->pNext;
	}

	// Registry-Key schliessen
	RegCloseKey(hKey);
}

void CPortList::Load(TCHAR *sRoot)
{
	HKEY hKey;

	// Registry-Key oeffnen
	if(RegOpenKeyEx(
		HKEY_LOCAL_MACHINE,
		sRoot,
		0,
		KEY_QUERY_VALUE,
		&hKey) != ERROR_SUCCESS)
			return;

	// Pfade der Ports lesen
	TCHAR sPath[MAX_PATH];
	TCHAR sPort[5];

	DWORD dwSize;
	LONG ret;

	DWORD z=1;

	do
	{
		_ultot(z++,sPort,10);

		dwSize=sizeof(sPath);
		ret=RegQueryValueEx(
			hKey,		
			sPort,			//value name
			0,				//reserved
			NULL,			//Typ
			(BYTE*)sPath,	//value
			&dwSize);		//buffer size

		if(ret==ERROR_SUCCESS)
			AddPort(sPath,0);
	}while(ret==ERROR_SUCCESS);

	// Registry-Key schliessen
	RegCloseKey(hKey);
}

PORT *CPortList::FindPort(TCHAR *sPath)
{
	PORT *pPort=m_pFirst;

	while(pPort->pNext)
	{
		if(_tcsicmp(sPath,pPort->sPath)==0)
			return pPort;
		pPort=pPort->pNext;
	}

	return NULL;
}

BOOL CPortList::DeletePort(TCHAR *sPath)
{
	PORT *pPort=m_pFirst;
	PORT *pPrevPort=m_pFirst;
	
	while(pPort->pNext)
	{
		if(_tcsicmp(sPath,pPort->sPath)==0)
		{
			if(pPort==m_pFirst)
			{
				m_pFirst=m_pFirst->pNext;
				delete pPort;
			}
			else
			{
				pPrevPort->pNext=pPort->pNext;
				delete pPort;
			}

			return TRUE;
		}
		
		pPrevPort=pPort;
		pPort=pPort->pNext;
	}

	return FALSE;
}

DWORD CPortList::Count()
{
	DWORD dwCount=0;
	PORT *pPort=m_pFirst;

	while(pPort->pNext)
	{
		++dwCount;
		pPort=pPort->pNext;
	}

	return dwCount;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -