<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title> Лента записей | Режет, варит - Во-ооо, программирует! | Форум Old-Games.RU. Всё о старых играх</title>
    <description>Средний срок службы жесткого диска заканчивается на 15-20 тысячах часов. Можно встретить диск с 25-30 тысячами отработанных часов (находящийся в рабочем состоянии).
Программа выведет сообщение о жестких дисках:
Drive "WDC WD1600AAJB-00PVA0" - Диск (номер-модель).
Power-On Time Count: 9404 - Отработанные часы.
[IMG]https://i.postimg.cc/cC2LdDxn/Get-Power-On.png[/IMG]
[SPOILER="Фрагмент файла - GetPowerOn.cpp"]
[CODE]/* GetPowerOn.cpp
*
* Средний срок службы жесткого диска заканчивается
* на 15-20 тысячах часов. Можно встретить диск с 25-30
* тысячами отработанных часов (находящийся в рабочем состоянии).
* Программа выведет сообщение о жестких дисках:
* Drive "WDC WD1600AAJB-00PVA0" - Диск (номер-модель).
* Power-On Time Count: 9404 - Отработанные часы.
*/

#include &lt;windows.h&gt;
#include "GetPowerOn.h"

char* GAppname="GetPowerOn'";
char g_szHardDriveSerialNumber[128];
char g_szHardDriveModelNumber[128];

char* ConvertToString(DWORD dwDiskdata[256], int firstIndex, int lastIndex, char* buf) {
    int index, position;
    index=position=0;
    /* Each integer has two characters stored in it backwards. */
    for(index = firstIndex; index &lt;= lastIndex; ++index) {
        /* Get high byte for 1st character. */
        buf[position++]=(char)(dwDiskdata[index]/256);
        /*  Get low byte for 2nd character. */
        buf[position++]=(char)(dwDiskdata[index]%256);
    }
    buf[position]=0; /*  End the string. */
    /*  Cut off the trailing blanks. */
    for(index=position-1;index&gt;0 &amp;&amp; isspace(buf[index]);--index)
        buf[index]=0;
    return buf;
}

void PrintIdeInfo(int numDrive, DWORD dwDiskdata[256]) {
    char svSerialNumber[128];
    char svModelNumber[128];
    char svRevisionNumber[128];
    char svControllerBuffer[32];
    char svBuff[512];
    __int64 Sectors, DiskSize;
    Sectors=DiskSize=0;
    /* Copy the hard drive serial number to the buffer. */
    ConvertToString(dwDiskdata, 10, 19, svSerialNumber);
    ConvertToString(dwDiskdata, 27, 46, svModelNumber);
    ConvertToString(dwDiskdata, 23, 26, svRevisionNumber);

    DiskSize=dwDiskdata[21] * 512;
    wsprintf(svControllerBuffer,"%u",dwDiskdata[21] * 512);

    /* Serial number must be alphanumeric
    but there can be leading spaces on IBM drives. */
    if(!g_szHardDriveSerialNumber[0] &amp;&amp;
        (isalnum(svSerialNumber[0]) ||
        isalnum(svSerialNumber[19])) ) {
        lstrcpy(g_szHardDriveSerialNumber,svSerialNumber);
        lstrcpy(g_szHardDriveModelNumber,svModelNumber);
    }

    wsprintf(svBuff,"Drive %d - ",numDrive);
    switch(numDrive / 2) {
    case 0:
        wsprintf(svBuff,"Primary Controller - ");
        break;
    case 1:
        wsprintf(svBuff,"Secondary Controller - ");
        break;
    case 2:
        wsprintf(svBuff,"Tertiary Controller - ");
        break;
    case 3:
        wsprintf(svBuff,"Quaternary Controller - ");
        break;
    }

    switch(numDrive % 2) {
    case 0:
        wsprintf(svBuff,"Master drive\n\n");
        break;
    case 1:
        wsprintf(svBuff,"Slave drive\n\n");
        break;
    }

    wsprintf(svBuff,"Drive Model Number________________: [%s]\n",svModelNumber);
    wsprintf(svBuff,"Drive Serial Number_______________: [%s]\n",svSerialNumber);
    wsprintf(svBuff,"Drive Controller Revision Number__: [%s]\n",svRevisionNumber);
    wsprintf(svBuff,"Controller Buffer Size on Drive___: %s bytes\n",svControllerBuffer);
    wsprintf(svBuff,"Drive Type________________________: ");

    if(dwDiskdata[0] &amp; 0x0080)
        wsprintf(svBuff,"Removable\n");
    else if(dwDiskdata[0] &amp; 0x0040)
        wsprintf(svBuff,"Fixed\n");
    else wsprintf(svBuff,"Unknown\n");

    /* Calculate size based on 28 bit or 48 bit addressing
    48 bit addressing is reflected by bit 10 of word 83 */
    if(dwDiskdata[83] &amp; 0x400) {
        Sectors=dwDiskdata[103] *
            65536I64 * 65536I64 * 65536I64 +
            dwDiskdata[102] * 65536I64 * 65536I64 +
            dwDiskdata[101] * 65536I64 + dwDiskdata[100];
    }
    else
        Sectors=dwDiskdata[61] * 65536 + dwDiskdata[60];

    /* There are 512 bytes in a sector. */
    DiskSize=Sectors * 512;

    wsprintf(svBuff,"Drive Size________________________: %I64d bytes (%.2f Gb)\n",
        DiskSize,
        (float)DiskSize / (1024 * 1024 * 1024));

    /*wsprintf(svBuff,"Drive%dModelNumber",numDrive);
    WriteConstantString(svBuff,svModelNumber);
    wsprintf(svBuff,"Drive%dSerialNumber",numDrive);
    WriteConstantString(svBuff,svSerialNumber);
    wsprintf(svBuff,"Drive%dControllerRevisionNumber",numDrive);
    WriteConstantString(svBuff,svRevisionNumber);
    wsprintf(svBuff,"Drive%dControllerBufferSize",numDrive);
    WriteConstantString(svBuff,svControllerBuffer);
    wsprintf(svBuff,"Drive%dType",numDrive);
    if(dwDiskdata[0] &amp; 0x0080)
        WriteConstantString(svBuff,"Removable");
    else if(dwDiskdata[0] &amp; 0x0040)
        WriteConstantString(svBuff,"Fixed");
    else
        WriteConstantString(svBuff,"Unknown");*/
}

void GetIdeInfo(HANDLE hDrive, int nDriveNumber) {
    GETVERSIONOUTPARAMS VersionParams;
    DWORD dwDiskdata[256], dwBytesReturned;
    BYTE bIDCmd;
    g_szHardDriveSerialNumber[0]=0;
    g_szHardDriveModelNumber[0]=0;
    /* Get the version, etc of PhysicalDrive IOCTL. */
    if(!DeviceIoControl(hDrive,DFP_GET_VERSION,NULL,0,&amp;VersionParams,sizeof(VersionParams),&amp;dwBytesReturned,NULL) ) {
        //mb("Failed DFP_GET_VERSION");
        return;
    }
    if(VersionParams.bIDEDeviceMap&lt;=0) {
        //mb("Failed no device found at position.");
        return;
    }
    bIDCmd=0; /* IDE or ATAPI IDENTIFY cmd */
    /* Now, get the ID sector for all IDE devices in the system.
    If the device is ATAPI use the IDE_ATAPI_IDENTIFY command
    otherwise use the IDE_ATA_IDENTIFY command. */
    bIDCmd=(VersionParams.bIDEDeviceMap &gt;&gt; nDriveNumber &amp; 0x10) ? IDE_ATAPI_IDENTIFY : IDE_ATA_IDENTIFY;
    BYTE IdOutCmd[sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1];

    /* Set up data structures for IDENTIFY command. */
    SENDCMDINPARAMS scip;
    scip.bDriveNumber=nDriveNumber;
    scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
    scip.irDriveRegs.bFeaturesReg=0;
    scip.irDriveRegs.bSectorCountReg=1;
    scip.irDriveRegs.bCylLowReg=0;
    scip.irDriveRegs.bCylHighReg=0;
    /* Compute the drive number. */
    scip.irDriveRegs.bDriveHeadReg=0xA0 | ((nDriveNumber &amp; 1) &lt;&lt; 4);
    /* The command can either be IDE identify or ATAPI identify. */
    scip.irDriveRegs.bCommandReg=bIDCmd;
    scip.cBufferSize=IDENTIFY_BUFFER_SIZE;
    if(DeviceIoControl(hDrive,DFP_RECEIVE_DRIVE_DATA,&amp;scip,sizeof(SENDCMDINPARAMS)-1,&amp;IdOutCmd,sizeof(SENDCMDOUTPARAMS)+IDENTIFY_BUFFER_SIZE-1,&amp;dwBytesReturned,NULL)) {
        USHORT* pIdSector=(USHORT*)((PSENDCMDOUTPARAMS)IdOutCmd)-&gt;bBuffer;
        for(int i=0;i&lt;256;++i)
            dwDiskdata[i]=pIdSector[i];
        PrintIdeInfo(nDriveNumber,dwDiskdata);
    }
}
[/CODE]
[/SPOILER]
Программу можно собрать с помощью BAT-файла (в пакете), но нужно, чтобы на компьютере была установлена Visual Studio 6.0 (это 1998 год выпуска) или любой другой версией выше - открыв DSP-файл. В самом пакете есть уже собранный EXE.
Перед сборкой BAT-файлом, сначала - измените пути на ваши (отредактировав)!</description>
    <pubDate>Thu, 16 Apr 2026 10:16:32 +0000</pubDate>
    <lastBuildDate>Thu, 16 Apr 2026 10:16:32 +0000</lastBuildDate>
    <generator>Форум Old-Games.RU. Всё о старых играх</generator>
    <link>https://www.old-games.ru/forum/blogs/blog/rezhet-varit-vo-ooo-programmiruet.241143/</link>
    <atom:link rel="self" type="application/rss+xml" href="https://www.old-games.ru/forum/blogs/blog/rezhet-varit-vo-ooo-programmiruet.241143/index.rss"/>
    <item>
      <title>Query server Unreal Tournament 99 (Опрос сервера)</title>
      <pubDate>Mon, 20 Jan 2025 05:07:11 +0000</pubDate>
      <link>https://www.old-games.ru/forum/blogs/query-server-unreal-tournament-99-opros-servera.6328/</link>
      <guid>https://www.old-games.ru/forum/blogs/query-server-unreal-tournament-99-opros-servera.6328/</guid>
      <author>jmp</author>
      <dc:creator>jmp</dc:creator>
      <content:encoded><![CDATA[Программа QueryUT99 получает информацию от сервера.<br />
Информирует о количестве игроков - кто в данный момент играет (онлайн) или нет. Получает дополнительные данные: т.к. (см. на рисунке).<br />
<img src="proxy.php?image=https%3A%2F%2Fi.postimg.cc%2Frw8XRbtD%2FQuery-UT99.png&amp;hash=98a3167182ac431129f698db5dc66399" class="bbCodeImage LbImage" alt="[&#x200B;IMG]" data-url="https://i.postimg.cc/rw8XRbtD/Query-UT99.png" /> <br />
Исходный код прилагается.<br />
Программа написана на ЯП С++. Собрать можно всеми доступными компиляторами (включая Borland C++ 5.2). Для Borland имеется Makefile. Те-кто будет собирать Visual Studio, нужно открыть файл-DSP или запустить BAT-файл.<br />
<br />
Как...<br />
<br />
<a href="https://www.old-games.ru/forum/blogs/query-server-unreal-tournament-99-opros-servera.6328/" class="internalLink">Query server Unreal Tournament 99 (Опрос сервера)</a>]]></content:encoded>
    </item>
  </channel>
</rss>
