目前发现的错误如下,相信书中还有许多问题未被发现,请大家发现新的错误及时提出,我会尽快修正的。

1、P52页 第15行 原文“返回0表示在HOOK数组中的序号” 修改后为“成功时返回在HOOK数组中的序号

2、P53页 第15行 原文“返回0表示在HOOK数组中的序号” 修改后为“成功时返回在HOOK数组中的序号

3、P164,P165页的Xcopy()函数代码有误,正确代码如下:

 /** 将一个目录及子目录下的所有文件复制到另外一个目录下

 @param char *pszSrcDir - 要拷贝的源目录 

 @param char *pszTargeDir - 目标目录 

 @param BOOL bOverWrite - 覆盖标志,FALSE表示覆盖 

 @return void - 无 

*/

void Xcopy( char *pszSrcDir, char *pszTargeDir, BOOL bOverWrite )

{

 char   lBaseSearch[MAX_PATH];

 HANDLE   lhFile;

 WIN32_FIND_DATA lfData;

 sprintf( lBaseSearch, "%s\\*.*", pszSrcDir );

 lhFile = FindFirstFile( lBaseSearch, &lfData );

 if ( lhFile == INVALID_HANDLE_VALUE ) {

  return;

 }

 do {

  CreateDirectory( pszTargeDir, NULL );

  if ( !strcmp( lfData.cFileName, "." ) ||

    !strcmp( lfData.cFileName, ".." )) {

   /* 跳过 . and .. 不处理 */

   continue;

  }

  if ( lfData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) {

   /* 目录 */

   char szBaseDir[MAX_PATH];

   char szTargeDir[MAX_PATH];

   sprintf( szBaseDir, "%s\\%s", pszSrcDir, lfData.cFileName );

   sprintf( szTargeDir, "%s\\%s", pszTargeDir, lfData.cFileName );

   Xcopy( szBaseDir, szTargeDir, bOverWrite );

  }

  else {

   /* 普通文件 */

   char szBaseDir[MAX_PATH];

   char szTargeDir[MAX_PATH];

   sprintf( szBaseDir, "%s\\%s", pszSrcDir, lfData.cFileName );

   sprintf( szTargeDir, "%s\\%s", pszTargeDir, lfData.cFileName );

   CopyFile( szBaseDir, szTargeDir, bOverWrite );

  }

 } while ( FindNextFile( lhFile, &lfData ));

 FindClose( lhFile );

}

4、P335页 第13行 原文“发送操作会阻塞在哪里? 修改后为 “发送操作会阻塞在那里。

5、P203页 第22~29行 原文如下:

  if ( pDelNode == pANode->pLeft )

        {

            pANode->nMagic -= 1;

        }

        else

        {

            pANode->nMagic += 1;

        }

需要将这段代码移到P203页第9行和第10行之间 ,修改后的第9~21行代码为:

        pNode->pData = pDelNode->pData;

        if ( pDelNode == pANode->pLeft )

        {

            pANode->nMagic -= 1;

        }

        else

        {

            pANode->nMagic += 1;

        }

        if (pDelNode != pNode->pLeft)

        {

            pANode->pRight = pDelNode->pLeft;

        }


6、P265页 倒数第7行 原文 "while (pCursor == NULL)"


   需要在倒数第8行和倒数第7行之间插入以下两行代码:


     if ( pCursor == NULL )

     {

    P266页第11行 原文“pData = pCursor->pData;”


    需要在第10行和11行间插入一个右大括号 “}”


 7、P343页倒数第12行原文 “for (i = 0; i < uSpaceCount; i++)”

     改为: “for (i = 0; i < uSpaceCount - 1; i++)”


     P343页倒数第5行原文 “ pNode->pNext = NULL;”


    需要在倒数第5行后面插入一行 “pNode->uPos = uPos;”


 


8、 P34页第16行原文 “UINT uHead;”


        需要在第16行后插入一行 “void *pData;”


                  


        P34页倒数第12行,原文“if ( pBlock->uHead == pBlock->uTail )”


        需要在倒数第12行前插入以下一行代码:


                   pData = pBlock->ppData[uHead];


        P34页倒数第3行 原文       “return pBlock->ppData[uHead];”


        改为:“return pData;”


  


9、光盘CAPI目录下的DeQueue.c 文件中第146行(DeQue_Destroy()函数里)


      原文:  “for ( i = pQue->pFirst->uMapPos; i <= pQue->pLast->uMapPos; i++)”


      改为以下四行代码:


                    UINT         uStart, uEnd;


                   uStart = pQue->pFirst->uMapPos;


                   uEnd = pQue->pLast->uMapPos;


                   for ( i = uStart; i <= uEnd; i++)


 


10、光盘中CAPI目录下的DSpaceList.c文件中 (书中这段代码与光盘不一致,以光盘为准)


文件的第141行 原文“pDSNode->uInListFlag = DSPACENODE_NOT_IN_LIST;”


需要在第140行和141行之间插入以下代码:


                            else


                            {


                                     pList->pTail = NULL;


                          }



第253行 原文 “if ( pDSNode->pSpList->uFreeCount == pList->uDataCount”


改为:        “if ( pDSNode->pSpList->uFreeCount == pList->uDataCount - 1”


        第262行 原文     “/* 从双向链表中删除此节点 */”


        需要在262行前插入以下两行代码


                   if ( pDSNode->uInListFlag == DSPACENODE_IN_LIST )


                   {


第270行 原文       “ if ( pList->pHead = pDSNode )”


改为: “if ( pList->pHead == pDSNode )”


 


        第278行 原文 “/* pDSNode加入到pEmpty为头节点的未使用链表中 */”


        需在第278行前插入一个右大括号作为一行  “}”


11、P111页倒数第9行    原文 “memcpy(pNode->pData, pData, uDataLen);”


需要在倒数第9行前插入以下一行代码:


pNode->pData = (void *)((char *)pNode + sizeof(SINGLENODE));


 


12、光盘CAPI目录下的Queue.c 文件中第72行(Queue_Destroy()函数里)         原文:  "if ( pQueue->uHead < pQueue->uTail )"

         修改为:"if ( pQueue->uHead > pQueue->uTail )"


13


14、P8页倒数第6行,原文“sizeof(pszMsg)”,改为:“MSG_COUNT”

、光盘CAPI目录下的DeQue.c 文件中第57行(DeQueBlock_Destroy()函数里)         原文:  "if ( pQueue->uHead < pQueue->uTail )"

         修改为:"if ( pQueue->uHead > pQueue->uTail )"