16,473
社区成员
发帖
与我相关
我的任务
分享
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "chs");
DOCDATAINFO ddi;
if(ParseData(L"C:\\a.txt", &ddi))
{
time_t job_date = ddi.job_date;
char *date = ctime(&job_date);
printf("HDDW: %u\n", ddi.hddw);
printf("COPIES: %u\n", ddi.copies);
printf("PAGEWIDTH: %u\n", ddi.page_width);
printf("PAGELENGTH: %u\n", ddi.page_length);
printf("PAGECOUNT: %u\n", ddi.page_count);
printf("COLOR: %u\n", ddi.color);
printf("DUPLEX: %u\n", ddi.duplex);
printf("JOBDATE: %u - %s\n", ddi.job_date, date);
printf("JOBCOST: %u\n", ddi.job_cost);
printf("JOBSIZE: %u\n", ddi.job_size);
printf("PORTTYPE: %u\n", ddi.port_type);
printf("AUDITOR_ID: %u\n", ddi.auditor_id);
printf("DOCUMENT: %S\n", ddi.document);
printf("ACCOUNT: %S\n", ddi.account);
printf("DOMAIN: %S\n", ddi.domain);
printf("LOCATION: %S\n", ddi.location);
printf("IP: %S\n", ddi.ip);
printf("GROUPNAME: %S\n", ddi.group_name);
printf("DEVICENAME: %S\n", ddi.device_name);
printf("PORTNAME: %S\n", ddi.port_name);
printf("PORT: %S\n", ddi.port);
printf("DRIVER: %S\n", ddi.driver);
printf("WKS_IP: %S\n", ddi.wks_ip);
}
return 0;
}
// test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <time.h>
#include <locale.h>
struct DOCDATALIST
{
WORD name_len;
WORD data_len;
BYTE *name;
BYTE *data;
DOCDATALIST *next;
};
struct DOCDATAINFO
{
WORD hddw;
DWORD copies;
DWORD page_width;
DWORD page_length;
DWORD page_count;
DWORD color;
DWORD duplex;
DWORD job_date;
DWORD job_cost;
DWORD job_size;
DWORD port_type;
DWORD auditor_id;
WCHAR document[MAX_PATH];
WCHAR account[MAX_PATH];
WCHAR domain[MAX_PATH];
WCHAR location[MAX_PATH];
WCHAR ip[MAX_PATH];
WCHAR group_name[MAX_PATH];
WCHAR device_name[MAX_PATH];
WCHAR port_name[MAX_PATH];
WCHAR port[MAX_PATH];
WCHAR driver[MAX_PATH];
WCHAR wks_ip[MAX_PATH];
};
static void swap_bytes(void *p, int len)
{
unsigned char *s = (unsigned char *)p;
unsigned char *e = (unsigned char *)p + len - 1;
while(s < e)
{
*s ^= *e; *e ^= *s; *s ^= *e;
s++; e--;
}
}
DOCDATALIST *CreateDocDataList(WCHAR *pFileName)
{
if(pFileName == NULL)
{
return NULL;
}
HANDLE hFile = CreateFileW(pFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return NULL;
}
DOCDATALIST *pList = NULL;
DOCDATALIST *pNode = NULL;
while(1)
{
WORD nNameLen = 0;
WORD nDataLen = 0;
BYTE *pName = NULL;
BYTE *pData = NULL;
DWORD nReadBytes = 0;
ReadFile(hFile, &nNameLen, 2, &nReadBytes, NULL);
if(nNameLen == 0 || nReadBytes < 2)
{
break;
}
swap_bytes(&nNameLen, 2);
pName = new BYTE[nNameLen];
ReadFile(hFile, pName, nNameLen, &nReadBytes, NULL);
if(nReadBytes < nNameLen)
{
delete[] pName;
break;
}
ReadFile(hFile, &nDataLen, 2, &nReadBytes, NULL);
if(nDataLen == 0 || nReadBytes < 2)
{
delete[] pName;
break;
}
swap_bytes(&nDataLen, 2);
pData = new BYTE[nDataLen];
ReadFile(hFile, pData, nDataLen, &nReadBytes, NULL);
if(nReadBytes < nDataLen)
{
delete[] pName;
delete[] pData;
break;
}
if(pList == NULL)
{
pNode = new DOCDATALIST;
pList = pNode;
pNode->name_len = nNameLen;
pNode->data_len = nDataLen;
pNode->name = pName;
pNode->data = pData;
pNode->next = NULL;
}
else
{
pNode->next = new DOCDATALIST;
pNode->next->name_len = nNameLen;
pNode->next->data_len = nDataLen;
pNode->next->name = pName;
pNode->next->data = pData;
pNode->next->next = NULL;
pNode = pNode->next;
}
}
CloseHandle(hFile);
return pList;
}
void DestroyDocDataList(DOCDATALIST *pList)
{
while(pList != NULL)
{
DOCDATALIST *pNext = pList->next;
if(pList->name_len)
{
delete[] pList->name;
}
if(pList->data_len)
{
delete[] pList->data;
}
delete pList;
pList = pNext;
}
}
BOOL ParseData(WCHAR *pFileName, DOCDATAINFO *pInfo)
{
DOCDATALIST *pList = CreateDocDataList(pFileName);
if(pList == NULL)
{
return FALSE;
}
memset(pInfo, 0, sizeof(DOCDATAINFO));
DOCDATALIST *pNode = pList;
while(pNode != NULL)
{
if((pNode->name_len == sizeof("HDDW")) && (memcmp(pNode->name, "HDDW", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->hddw))
{
memcpy(&pInfo->hddw, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"COPIES")) && (memcmp(pNode->name, L"COPIES", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->copies))
{
memcpy(&pInfo->copies, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGEWIDTH")) && (memcmp(pNode->name, L"PAGEWIDTH", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_width))
{
memcpy(&pInfo->page_width, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGELENGTH")) && (memcmp(pNode->name, L"PAGELENGTH", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_length))
{
memcpy(&pInfo->page_length, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PAGECOUNT")) && (memcmp(pNode->name, L"PAGECOUNT", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->page_count))
{
memcpy(&pInfo->page_count, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"COLOR")) && (memcmp(pNode->name, L"COLOR", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->color))
{
memcpy(&pInfo->color, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DUPLEX")) && (memcmp(pNode->name, L"DUPLEX", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->duplex))
{
memcpy(&pInfo->duplex, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBDATE")) && (memcmp(pNode->name, L"JOBDATE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_date))
{
memcpy(&pInfo->job_date, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBCOST")) && (memcmp(pNode->name, L"JOBCOST", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_cost))
{
memcpy(&pInfo->job_cost, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"JOBSIZE")) && (memcmp(pNode->name, L"JOBSIZE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->job_size))
{
memcpy(&pInfo->job_size, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORTTYPE")) && (memcmp(pNode->name, L"PORTTYPE", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->port_type))
{
memcpy(&pInfo->port_type, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"AUDITOR_ID")) && (memcmp(pNode->name, L"AUDITOR_ID", pNode->name_len) == 0))
{
if(pNode->data_len == sizeof(pInfo->auditor_id))
{
memcpy(&pInfo->auditor_id, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DOCUMENT")) && (memcmp(pNode->name, L"DOCUMENT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->document))
{
memcpy(pInfo->document, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"ACCOUNT")) && (memcmp(pNode->name, L"ACCOUNT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->account))
{
memcpy(pInfo->account, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DOMAIN")) && (memcmp(pNode->name, L"DOMAIN", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->domain))
{
memcpy(pInfo->domain, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"LOCATION")) && (memcmp(pNode->name, L"LOCATION", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->location))
{
memcpy(pInfo->location, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"IP")) && (memcmp(pNode->name, L"IP", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->ip))
{
memcpy(pInfo->ip, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"GROUPNAME")) && (memcmp(pNode->name, L"GROUPNAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->group_name))
{
memcpy(pInfo->group_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DEVICENAME")) && (memcmp(pNode->name, L"DEVICENAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->device_name))
{
memcpy(pInfo->device_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORTNAME")) && (memcmp(pNode->name, L"PORTNAME", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->port_name))
{
memcpy(pInfo->port_name, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"PORT")) && (memcmp(pNode->name, L"PORT", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->port))
{
memcpy(pInfo->port, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"DRIVER")) && (memcmp(pNode->name, L"DRIVER", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->driver))
{
memcpy(pInfo->driver, pNode->data, pNode->data_len);
}
}
else if((pNode->name_len == sizeof(L"WKS_IP")) && (memcmp(pNode->name, L"WKS_IP", pNode->name_len) == 0))
{
if(pNode->data_len <= sizeof(pInfo->wks_ip))
{
memcpy(pInfo->wks_ip, pNode->data, pNode->data_len);
}
}
pNode = pNode->next;
}
DestroyDocDataList(pList);
swap_bytes(&pInfo->hddw, sizeof(pInfo->hddw));
swap_bytes(&pInfo->copies, sizeof(pInfo->copies));
swap_bytes(&pInfo->page_width, sizeof(pInfo->page_width));
swap_bytes(&pInfo->page_length, sizeof(pInfo->page_length));
swap_bytes(&pInfo->page_count, sizeof(pInfo->page_count));
swap_bytes(&pInfo->color, sizeof(pInfo->color));
swap_bytes(&pInfo->duplex, sizeof(pInfo->duplex));
swap_bytes(&pInfo->job_date, sizeof(pInfo->job_date));
swap_bytes(&pInfo->job_cost, sizeof(pInfo->job_cost));
swap_bytes(&pInfo->job_size, sizeof(pInfo->job_size));
swap_bytes(&pInfo->port_type, sizeof(pInfo->port_type));
swap_bytes(&pInfo->auditor_id, sizeof(pInfo->auditor_id));
return TRUE;
}