📄 server.cpp
字号:
NULL, // GUID implies protocol so no need to specify
RES_SERVICE, // Specifies that we are trying to find local address to bind to
NULL, // Currently not supported
CSABuf, // Results buffer
&dwCSABufsize, // Size of results buffer
NULL, // Not supported
NULL); // Not supported
// Need at least one address returned in order to bind()
GetLastError();
if(bind(SocketNum, CSABuf[0].LocalAddr.lpSockaddr, CSABuf[0].LocalAddr.iSockaddrLength)==SOCKET_ERROR){
closesocket(SocketNum);
return FALSE;
}
if (getsockname(SocketNum,
(PSOCKADDR) &CSABuf[0].LocalAddr.lpSockaddr,
(PINT) &CSABuf[0].LocalAddr.iSockaddrLength) == SOCKET_ERROR){
// Error -- better cleanup
closesocket(SocketNum);
return FALSE;
}
// Listen on the socket
if (listen(SocketNum, 5) == SOCKET_ERROR)
{
// Error -- cleanup
MessageBox(hDlg, "Error in listen", "LISTEN", MB_OK);
closesocket(SocketNum);
return FALSE;
}
if(WSAAsyncSelect(SocketNum,
hDlg,
MW_CONNECTED,
FD_ACCEPT) == SOCKET_ERROR)
{
// Error -- cleanup
MessageBox(hDlg, "Error in WSAAsyncSelect", "ERROR", MB_OK);
closesocket(SocketNum);
return FALSE;
}
return TRUE;
}
void InitDisks(void)
{
gOSWin95 = ((int) GetVersion() < 0);
if(gOSWin95){
hLib = LoadLibrary("Disk32.DLL");
if(hLib == NULL){
MessageBox(NULL, "Disk32.DLL not found", " SERVER", MB_OK);
return;
}
DllThunk32 = (DLLFUNC *) GetProcAddress(hLib, "ReadDisk32");
if(DllThunk32 == NULL){
MessageBox(NULL, "ReadDisk32 Function not accessible!", "SERVER", MB_OK);
return;
}
DllThunk32Write = (DLLFUNC *) GetProcAddress(hLib, "WriteDisk32");
if(DllThunk32Write == NULL){
MessageBox(NULL, "WriteDisk32 Function not accessible!", "SERVER", MB_OK);
return;
}
DllCheckInt13Extension = (DLLCHECK *) GetProcAddress(hLib, "CheckInt13Extension32");
if(DllCheckInt13Extension == NULL){
MessageBox(NULL, "DllCheckInt13Extension Function not accessible!", "SERVER", MB_OK);
return;
}
hVxD = CreateFile("\\\\.\\DISK.VXD", 0,0,0,
CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0);
if ( hVxD == INVALID_HANDLE_VALUE )
{
MessageBox(NULL, "Unable to open DISK.VXD", "SERVER", MB_OK);
NumFloppies = 0;
EnumTreeRoot();
return;
dwErrorCode = GetLastError();
if ( dwErrorCode == ERROR_NOT_SUPPORTED ){
MessageBox(NULL, "Unable to open DISK.VXD.\nDevice does not support DeviceIOCTL\n", "SERVER", MB_OK);
return;
}
else{
MessageBox(NULL, "Unable to open DISK.VXD", "SERVER", MB_OK);
}
return;
}
else
{
DeviceIoControl(hVxD, DISK_DETECT,
(LPVOID)NULL, 0,
(LPVOID)RetInfo, sizeof(RetInfo),
&cbBytesReturned, NULL);
NumFloppies = RetInfo[0];
CloseHandle(hVxD);
EnumTreeRoot();
}
}
else{
char TmpStr[]="A:\\";
NumFloppies = 0;
for(int i=0; i<26; i++){
TmpStr[0] = 'A'+i;
if(GetDriveType(TmpStr)==DRIVE_REMOVABLE)
NumFloppies++;
}
EnumTreeRoot();
}
}
void EnumTreeRoot(void)
{
char TmpStr1[1000];
for(i=0;;i++){
if(gOSWin95){
if(!(DllThunk32)(i+0x80, 0, 0, 1, 1, (LPBYTE) TmpStr1, 0, FALSE))
break;
}
else{
if(hDisk[i+0x80])
CloseHandle(hDisk[i+0x80]);
char TmpStr[26] = "\\\\.\\PHYSICALDRIVE0";
TmpStr[17] = i+'0';
if((hDisk[i+0x80]=CreateFile(TmpStr, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE)
break;
}
NumHards++;
}
}
BOOL LoadSectors(DRIVEPACKET *DrivePacket, LPBYTE Buffer)
{
DRIVEPACKET TmpDP, TmpDrivePacket;
DWORD TmpVal = DrivePacket->NumSectors;
BOOL Int13ExtFlag;
memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
if(gOSWin95){
do{
Int13ExtFlag = CalcCylHeadSect(&TmpDP, &CylHeadSect);
DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect.Sector & 0x3F) + 1;
TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
if(!(DllThunk32)(DrivePacket->Drive, CylHeadSect.Cylinder, CylHeadSect.Head, CylHeadSect.Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag /*& Int13ExtFlag*/)){
if (TmpNumSectors == 1)
return FALSE;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<TmpNumSectors; i++){
TmpDrivePacket.NumSectors = 1;
if(!LoadSectors(&TmpDrivePacket, (LPBYTE)(Buffer+i*512))){
for(int j=0; j<512; j++){
Buffer[i*512+j] = 0xE5;
}
}
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
TmpVal -= TmpNumSectors;
TmpDP.RelativeSector += TmpNumSectors;
}while(TmpVal);
}
else{
__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
long TmpVal = Tmp64 & 0xFFFFFFFF;
long TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
if((!TmpVal) && (DrivePacket->Drive < 0x80)){
CloseHandle(hDisk[DrivePacket->Drive]);
char TmpStr[100];
wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
return FALSE;
}
Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
TmpVal = Tmp64 & 0xFFFFFFFF;
TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
ReadFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
}
if(TmpVal != (DrivePacket->NumSectors * 512)){
if (DrivePacket->NumSectors == 1)
return FALSE;
DRIVEPACKET TmpDrivePacket;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<DrivePacket->NumSectors; i++){
TmpDrivePacket.NumSectors = 1;
if(!LoadSectors(&TmpDrivePacket, (LPBYTE)(Buffer+i*512))){
for(int j=0; j<512; j++){
Buffer[i*512+j] = 0xE5;
}
}
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
}
return TRUE;
}
BOOL WriteSectors(DRIVEPACKET *DrivePacket, LPBYTE Buffer)
{
DRIVEPACKET TmpDP, TmpDrivePacket;
DWORD TmpVal = DrivePacket->NumSectors;
BOOL Int13ExtFlag;
memcpy(&TmpDP, DrivePacket, sizeof(DRIVEPACKET));
if(gOSWin95){
do{
Int13ExtFlag = CalcCylHeadSect(&TmpDP, &CylHeadSect);
DWORD TmpNumSectors = TmpDP.SectorsPerTrack - (CylHeadSect.Sector & 0x3F) + 1;
TmpNumSectors = TmpVal > TmpNumSectors ? TmpNumSectors:TmpVal;
if(!(DllThunk32Write)(DrivePacket->Drive, CylHeadSect.Cylinder, CylHeadSect.Head, CylHeadSect.Sector, TmpNumSectors, Buffer+(DrivePacket->NumSectors - TmpVal) * 512, DrivePacket->NTRelativeSector + TmpDP.RelativeSector, DrivePacket->Flag /*& Int13ExtFlag*/)){
if (TmpNumSectors == 1)
return FALSE;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<TmpNumSectors; i++){
TmpDrivePacket.NumSectors = 1;
WriteSectors(&TmpDrivePacket, (LPBYTE)(Buffer+i*512));
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
TmpVal -= TmpNumSectors;
TmpDP.RelativeSector += TmpNumSectors;
}while(TmpVal);
}
else{
__int64 Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
long TmpVal = Tmp64 & 0xFFFFFFFF;
long TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
if((!TmpVal) && (DrivePacket->Drive < 0x80)){
CloseHandle(hDisk[DrivePacket->Drive]);
char TmpStr[100];
wsprintf(TmpStr, "\\\\.\\%c:", DrivePacket->Drive+'A');
if((hDisk[DrivePacket->Drive]=CreateFile(TmpStr, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL))==INVALID_HANDLE_VALUE){
return FALSE;
}
Tmp64 = (((__int64) DrivePacket->NTRelativeSector) + ((__int64) DrivePacket->RelativeSector)) * 512;
TmpVal = Tmp64 & 0xFFFFFFFF;
TmpValHi = (Tmp64 >> 32);
SetFilePointer(hDisk[DrivePacket->Drive], TmpVal, &TmpValHi, FILE_BEGIN);
TmpVal = 0;
WriteFile(hDisk[DrivePacket->Drive], Buffer, DrivePacket->NumSectors * 512, (DWORD *) &TmpVal, NULL);
}
if(TmpVal != (DrivePacket->NumSectors * 512)){
if (DrivePacket->NumSectors == 1)
return FALSE;
DRIVEPACKET TmpDrivePacket;
memcpy(&TmpDrivePacket, &TmpDP, sizeof(DRIVEPACKET));
for(int i=0; i<DrivePacket->NumSectors; i++){
TmpDrivePacket.NumSectors = 1;
WriteSectors(&TmpDrivePacket, (LPBYTE)(Buffer+i*512));
TmpDrivePacket.RelativeSector++;
}
return FALSE;
}
}
return TRUE;
}
BOOL CalcCylHeadSect(DRIVEPACKET *DrivePacket, CYLHEADSECT *CylHeadSect)
{
DWORD TmpCyl, TmpSector;
TmpCyl = DrivePacket->Cylinder;
TmpSector = DrivePacket->Sector;
TmpCyl |= ((TmpSector & 0xC0) << 2);
TmpSector &= 0x3f;
DWORD TmpRelSect = (TmpCyl * DrivePacket->TotalHeads +
DrivePacket->Head) * DrivePacket->SectorsPerTrack + TmpSector-1 + DrivePacket->RelativeSector;
CylHeadSect->Sector = TmpRelSect % DrivePacket->SectorsPerTrack + 1;
DWORD CalcSect = TmpRelSect / DrivePacket->SectorsPerTrack;
CylHeadSect->Cylinder = CalcSect/DrivePacket->TotalHeads;
if(CylHeadSect->Cylinder > 1023)
return TRUE;
CylHeadSect->Head = CalcSect % DrivePacket->TotalHeads;
CylHeadSect->Sector |= (CylHeadSect->Cylinder & 0x300) >> 2;
CylHeadSect->Cylinder &= 0xFF;
return FALSE;
}
BOOL AllocateBuffer(DWORD NumSectors)
{
if(NumAllocSectors < NumSectors){
if(hBuffer){
LocalUnlock(hBuffer);
LocalFree(hBuffer);
}
hBuffer = 0;
if((hBuffer = LocalAlloc(LMEM_MOVEABLE|LMEM_DISCARDABLE|LMEM_ZEROINIT, NumSectors*512)) == NULL)
return FALSE;
Buffer = (PBYTE) LocalLock(hBuffer);
NumAllocSectors = NumSectors;
return TRUE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -